returnItems()
是一个返回数组的方法,而不是数组本身,因此您不能像在这里尝试那样尝试引用它的索引:
System.out.println(animals.returnItems[i]);
您需要做的是引用从方法返回的数组上的索引,如下所示:
System.out.println(animals.returnItems()[i]);
Edit
您存储数据和返回数据的方式也存在问题。在你的构造函数中你创建arrayOfItems
作为一个数组Object
:
arrayOfItems = (T[]) new Object[size];
...但是你尝试将其作为数组返回T
in returnItems()
:
public T[] returnItems()
{
return arrayOfItems;
}
当您尝试运行代码时,您将收到异常:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
这是由于一种叫做类型擦除 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html。基本上,Java 编译器将用普通类替换所有泛型类型(Object
在本例中),并插入强制转换以保持类型安全。
所以这行来自你的main()
method:
for(int i=0; i < animals.returnItems().length;i++)
将会看到animals
is a Generic<String>
,并变成这样:
for(int i=0; i < ((String[])animals.returnItems()).length;i++)
但是您返回的数组是作为new Object[]
, not a new String[]
,除非该对象实际上是子类型,否则不能向下转换,因此会出现异常。
为了消除ClassCastException
,你可以改变returnItems()
像这样声明它的实际返回类型:
public Object[] returnItems()
{
return arrayOfItems;
}
这将阻止编译器尝试插入数组的非法转换,但随后您需要手动将每个元素转换为适当的类型,这首先违背了使用泛型的目的。
正如 JBNizet 在上面的评论中指出的,数组和泛型“不能很好地结合在一起”,所以你最好使用ArrayList<T>
代替T[]
来存储您的数据。