栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

泛型,数组和ClassCastException

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

泛型,数组和ClassCastException

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的类型一无所知。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/383070.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号