【发布时间】:2021-11-20 09:20:17
【问题描述】:
我有以下代码:
abstract public class Base {
private static final HashMap<Integer, ? extends Base> hashMap = new HashMap<>();
public static <T extends Base> void put(Integer key, T val) {
hashMap.put(key, val);
}
public static <T extends Base> T get(Integer key) {
return hashMap.get(key);
}
}
所以,我在 Base.put() 方法中得到了不兼容的类型:<T extends Base> 和 <? extends Base>。
有什么区别以及如何正确重写该代码?
【问题讨论】:
-
你不能就这样。通配符泛型意味着“这些范围内的某些特定类型,但我不知道是什么”。
?的意思是“我也不在乎”。但它仍然是单一的特定类型。您的put方法允许调用者指定类型 - 因此编译器无法保证类型安全。删除泛型,全部改成Base,这样就可以了。 -
@BoristheSpider 我只是试图用泛型阐明类型继承,但这不是必需的,我明白了。