为了账号安全,请及时绑定邮箱和手机立即绑定

java类型强转为泛型V,竟然没有报错?

java类型强转为泛型V,竟然没有报错?

慕田峪7331174 2019-03-01 10:57:57
public class StrictMap<V> extends HashMap<String, V> { private static final long serialVersionUID = -3455861209780003757L; private String name; public StrictMap(int initialCapacity, float loadFactor, String name) { super(initialCapacity, loadFactor); this.name = name; } public StrictMap(int initialCapacity, String name) { super(initialCapacity); this.name = name; } public StrictMap(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public V put(String key, V value) { if (containsKey(key)) { throw new RuntimeException("已经存在的key, keyName = " + key); } if (key.contains(".")) { final String shortName = getShortName(key); if (containsKey(shortName)) { // question 这边有个问题, 为什么没有抛出ClassCastException。 V ambiguity = (V) new Ambiguity("存在的shortName"); super.put(shortName, ambiguity); } else { super.put(shortName, value); } } return super.put(key, value); } @Override public V get(Object key) { V value = super.get(key); if (value == null) { throw new RuntimeException("keyName = " + key + ", 没有获取到value."); } if (value instanceof Ambiguity) { throw new RuntimeException("重复的shortName"); } return value; } static class Ambiguity { private String name; public Ambiguity(String name) { this.name = name; } public String getName() { return name; } } } ps:运行时也没报错。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

类型擦除为Object,强转为Object不会报错。

查看完整回答
反对 回复 2019-03-01
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

编译时只会有警告,不会报错的。Java Collections Framework里其实到处是这样的强转。
但运行时却会报错,如果V不是Ambiguity或者它的父类的话。

查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 770 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号