我有一个名为Identifier的类和一些名为Variable,Scalar等的类,它们都来自Identifier。
所以当我声明一个新的Hashmap时:
Hashmap<String, ? extends Identifier> hm = new Hashmap<String, ? extends Identifier>();
我打电话时返回类型是什么:
hm.get(String)
因为显然这样的事情无效:
(? extends Identifier) temp = hm.get(String);
如果不进行某种类型的转换或使用通用的Object作为类型,我真的不知道这个解决方案,我不想这样做。
答案 0 :(得分:4)
你无法知道。你所知道的是它是Identifier
类型,你应该对这种情况做出一切假设。
public Identifier getValue(string value) {
return hm.get(value);
}
答案 1 :(得分:1)
在到达get
之前,您将遇到问题,并对地图进行实例化。您无法使用通配符实例化类型:
// Can't do this!
new Hashmap<String, ? extends Identifier>()
因为您可能不关心可以存储哪种类型的Identifier
,所以只需完全删除通配符:
HashMap<String, Identifier> hm = new HashMap<String, Identifier>();
(这也允许使用put
方法,如果没有这个方法,以后就不会指向get
。)
和
Identifier temp = hm.get(someString);
答案 2 :(得分:1)
从概念上讲,它 几乎是(? extends Identifier)
。当然,你是对的,你不能写那个。但想想这究竟意味着什么:“某种类型是Identifier
的子类型”。换句话说:Identifier
! (请记住,类型是其自身的子类型。)
Identifier temp = hm.get(String);