[英]What's the difference between the generic array and the generic value?
public class Array<T> {
private Object[] array;
public Array(int sz) {
array = new Object[sz];
}
// ....
public T get(int index) { return (T)array[index]; }
public T[] rep() { return (T[])array; }
}
为什么编译器说(T[])array
是未经检查的强制转换,然后在我使用rep()
方法时引发ClassCastException
? 当我使用get()
方法()时为什么不抛出此异常?
为什么在我使用get()方法()时未引发此异常?
有两个原因 :
array
添加任何元素,则将使用sz
个null
值初始化array
。. (T)array[index]
语句试图将null
转换为T
(其中T
本质上是通过类型擦除替换为Object
)。 可以将null
强制转换为任何类型,因此这不是问题。 array
中,则语句(T)array[index]
可以正常工作的唯一方法是,位置index
处的元素是否是用于实例化Array
的相同类型或子类型(例如Array<Number> arr = new Array<Number>
而arr[index]
为1。这不是问题;但是,尝试在arr[index]
处插入一个String
,您肯定会从get
ClassCastException
。方法) 为什么编译器说(T [])数组是未经检查的强制转换,然后在我使用rep()时抛出ClassCastException
获得ClassCastException
的唯一方法是T
表示的类型与array
可以容纳的元素的类型不同。 例如,执行以下操作将导致ClassCastException
:
Array<Integer> a = new Array<Integer>();
Integer[] intArray = a.rep();//ClassCastException
在这里, T[]
表示一个Integer[]
因此在编译代码时没有问题。 但是,在运行时, array
的类型为Object[]
。 Object
数组不能向下转换为Integer
数组。 知道数组是由JVM与其他类不同的动态创建的,这也将有所帮助。
解决此问题的一种方法是将Array
实例化为Array<Object> arr = new Array<Object>
。
在get()
,您只关心数组中元素的实际运行时类型,我认为这是正确的,因为您有某种方法只能将T
放入数组中。 数组的实际运行时类型无关紧要。
在rep()
,您关心数组对象的实际运行时类型,因为您将其强制转换为T[]
。 您使用实际的运行时类型Object[]
创建了数组,因此,除非T
恰好是Object
否则对T[]
的强制转换将始终不正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.