最后,我想了解泛型和数组之间的关系,因此我将根据一个ArrayList<T>提供一个不适合我的示例:
Object[] elementData = new Object[size];这是存储泛型列表元素的地方。
public void add(T element){ elementData[size++] = element; }
public T get(int index) { return (T)elementData[index] }完全有效。我可以获取底层的<T>对象,但是包含对这些对象的引用的数组是Object。
与此形成对比的是:
public Object[] toArray()
{
Object[] result = new Object[size];
for(int i = 0;i<size;i++)
{
result[i] = elementData[i];
}
return result;
}我不能将返回数组中的元素转换为它们的真实类型,但是整个设置是相同的:一个包含对Object对象的引用的<T>数组。当试图将元素转换为它们的真实类型时,我得到了ClassCastException错误。
发布于 2016-02-08 12:49:47
如果查看Collection接口,就会发现有两个toArray()方法:
Object[] toArray()
返回包含此集合中所有元素的数组。<T> T[] toArray(T[] a)
返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。其原因是您不能生成泛型数组,因此只能返回一个Object[]。
创建toArray()的通用方法很简单:
public <T> T[] toArray(T[] arr)
{
T[] result = arr.size == size ? arr : (T[])java.lang.reflect.Array
.newInstance(arr.getClass().getComponentType(), size);
for(int i = 0;i<size;i++)
{
result[i] = elementData[i];
}
return result;
}发布于 2016-02-11 00:28:51
数组在运行时知道它们的组件类型。因此,要创建数组,需要在运行时提供组件类型。但是,在您的示例中,您在运行时不了解T。因此,您不能创建真正的T[]。您只能返回Object[],或者依赖于某个人给您提供可以在运行时获取T类型的东西。
发布于 2016-02-08 12:47:08
您可以将返回数组中的元素转换为它们的真实类型。但不能将数组转换为T
https://stackoverflow.com/questions/35269861
复制相似问题