使用通配符时返回Java Hashmap的类型

时间:2013-11-15 21:37:45

标签: java generics hashmap wildcard

我有一个名为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作为类型,我真的不知道这个解决方案,我不想这样做。

3 个答案:

答案 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);