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

在Java中强制转换为泛型类型不会引发ClassCastException吗?

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

在Java中强制转换为泛型类型不会引发ClassCastException吗?

就像cletus所说的那样,擦除意味着您不能在运行时检查它(并且由于您的转换,您不能在编译时检查它)。

请记住,泛型仅是编译时功能。集合 对象 没有任何通用参数,只有您创建的对该对象的 引用
。这就是为什么如果您需要从原始类型甚至是向下转换集合时会收到很多关于“未检查的强制转换”的警告的

Object
原因,因为编译器无法验证对象是否具有正确的泛型类型(如对象本身没有通用类型)。

另外,请记住转换的含义-这是一种告诉编译器“我知道您不一定可以检查类型是否匹配,但是请 相信我 ,我知道它们可以。”
当您(不正确地)覆盖类型检查(然后不正确)而导致类型不匹配时,您应该责怪谁?;-)

您的问题似乎出在缺乏异构通用数据结构的周围。我建议您的方法的类型签名应该更像

private static<K,V> voidaddToMap(Map<K,V> map, List<Pair<K, V>>vals)
,但是我不认为这样做真的可以给您带来任何好处。成对列表基本上是一个映射,因此构造typesafe
vals
参数以调用该方法将与直接填充该映射一样多。

如果您 确实确实 希望大致上保持类不变,但是要添加运行时类型安全性,则以下内容可能会给您一些想法:

private static<K,V> void addToMap(Map<K,V> map, Object ... vals, Class<K> keyClass, Class<V> valueClass) {  for(int i = 0; i < vals.length; i += 2) {    if (!keyClass.isAssignableFrom(vals[i])) {      throw new ClassCastException("wrong key type: " + vals[i].getClass());    }    if (!valueClass.isAssignableFrom(vals[i+1])) {      throw new ClassCastException("wrong value type: " + vals[i+1].getClass());    }    map.put((K)vals[i], (V)vals[i+1]); //Never throws ClassCastException!  }}


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

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

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