您的位置:首页技术文章
文章详情页

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

【字号: 日期:2023-11-09 10:46:34浏览:54作者:猪猪

问题描述

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:运行时也没报错。

问题解答

回答1:

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

回答2:

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

标签: java