Foo<Double> f = new Foo<Double>();
使用泛型类Foo的此版本时,然后对于成员变量
a,编译器实质上采用以下行:
private T[] a = (T[]) new Object[5];
和更换
T用
Double得到这个:
private Double[] a = (Double[]) new Object[5];
您不能从Object转换为Double,因此不能转换为ClassCastException。
更新和说明: 实际上,在运行一些测试代码之后,ClassCastException比这更微妙。例如,这个main方法可以正常工作,没有任何异常:
public static void main(String[] args) { Foo<Double> f = new Foo<Double>(); System.out.println(f.getA());}
当您尝试分配
f.getA()给以下类型的引用时,会发生此问题
Double[]:
public static void main(String[] args) { Foo<Double> f = new Foo<Double>(); Double[] a2 = f.getA(); // throws ClassCastException System.out.println(a2);}
这是因为有关成员变量的类型信息
a在运行时会被删除。泛型仅在 编译时 提供类型安全性(我在最初的文章中以某种方式忽略了这一点)。所以问题不在于
private T[] a = (T[]) new Object[5];
因为在运行时这段代码确实
private Object[] a = new Object[5];
当方法的结果(
getA()在运行时实际上返回
Object[])被分配给类型的引用时,就会发生问题,
Double[]因为无法将对象强制转换为Double,因此该语句引发ClassCastException。
更新2 :回答您的最后一个问题“为什么数组会破坏它?”
答案是因为语言规范不支持通用数组创建。有关更多信息,请参见此论坛帖子
-为了向后兼容,在运行时对T的类型一无所知。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)