- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我似乎无法理解我应该如何在 main 方法中使用 returnItems()
返回的数组。我有点害怕泛型。如果我继续梦想成为一名 Java 开发人员,我就会失去信心。当我阅读专业人士的一些代码时,他们似乎喜欢使用泛型,但我觉得这很吓人。如果我能得到一个我可以轻松理解的关于泛型的良好引用,我将不胜感激。
public class Generic<T> {
private int pos;
private final int size;
private T[] arrayOfItems;
public Generic(int size)
{
this.size = size;
pos = 0;
arrayOfItems = (T[]) new Object[size];
}
public void addItem(T item)
{
arrayOfItems[pos] = item;
pos++;
}
public void displayItems()
{
for(int i = 0;i<pos;i++){
System.out.println(arrayOfItems[i]);
}
}
public T[] returnItems()
{
return arrayOfItems;
}
}
public class GenericTesting {
public static void main(String[] args) {
Generic<String> animals = new Generic<String>(5);
Generic<Integer> numbers = new Generic<Integer>(5);
animals.addItem("Dog");
animals.addItem("Cat");
animals.addItem("Bird");
animals.addItem("Mouse");
animals.addItem("Elephant");
animals.displayItems();
numbers.addItem(1);
numbers.addItem(2);
numbers.addItem(3);
numbers.displayItems();
for(int i=0; i < animals.returnItems().length;i++)
{
System.out.println(animals.returnItems[i]);
}
}
}
最佳答案
returnItems()
是一种返回数组而不是数组本身的方法,因此您不能像在这里尝试那样尝试引用它的索引:
System.out.println(animals.returnItems[i]);
您需要做的是引用从方法返回的数组中的索引,如下所示:
System.out.println(animals.returnItems()[i]);
存储和返回数据的方式也有问题。在您的构造函数中,您创建 arrayOfItems
作为 Object
的数组:
arrayOfItems = (T[]) new Object[size];
...但是您尝试将其作为 T
的数组返回在 returnItems()
:
public T[] returnItems()
{
return arrayOfItems;
}
当你尝试运行你的代码时,你会得到一个异常:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
这是由于一个叫做 type erasure 的东西造成的.基本上,Java 编译器将用普通类(在本例中为 Object
)替换所有泛型类型,并插入强制转换以保持类型安全。
所以这行来自您的 main()
方法:
for(int i=0; i < animals.returnItems().length;i++)
会看到 animals
是 Generic<String>
,然后变成这样:
for(int i=0; i < ((String[])animals.returnItems()).length;i++)
但是您返回的数组创建为 new Object[]
, 不是 new String[]
,并且您不能向下转换,除非该对象实际上是子类型,因此是异常。
消除ClassCastException
, 你可以改变 returnItems()
像这样声明它的实际返回类型:
public Object[] returnItems()
{
return arrayOfItems;
}
这将防止编译器尝试插入数组的非法转换,但随后您需要手动将每个元素转换为适当的类型,这首先违背了使用泛型的目的。
正如 JBNizet 在上面的评论中所指出的,数组和泛型“不能很好地结合在一起”,所以你最好使用 ArrayList<T>
而不是 T[]
存储您的数据。
关于java - 从泛型类返回一个数组。如何在 main 方法中打印数组中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987782/
我是一名优秀的程序员,十分优秀!