我有一个interface dest
和一些实现此接口的类:
class destImpl1 implements dest { ... }
class destImpl2 implements dest { ... }
然后我有一个HashMap<dest,double> destHash
。我想要的是如此实例化destHash
:
destHash = new HashMap<destImpl1,double>();
以后像这样:
destHash = new HashMap<destImpl2,double>();
但代码没有编译。我在这里错过了什么?
答案 0 :(得分:4)
将destHash
声明为:
HashMap<? extends dest, Double> destHash
这表示&#34; A HashMap
其中K
是一个未知类型,其上限为dest
&#34;。
原因是即使Foo<Y>
是Foo<X>
的子类型,Y
也不是X
的子类型。但是Foo<? extends X>
表示Foo<T>
的所有可能的泛型类型调用的集合,其中type参数是X
的子类型。有关详细信息,请参阅The Java Tutorials > Upper Bounded Wildcards
请注意,您需要使用包装类型Double
而不是原语作为第二个类型参数。
评论:但是,如果您这样做,您可能无法真正使用HashMap
,因为您无法put
密钥和值。{这表明您的设计可能不正确(请参阅Guidelines for Wildcard Use)。