以 key 作为通用接口的 HashMap

Lor*_*aka 1 java generics

我有一个interface dest和一些实现这个接口的类:

class destImpl1 implements dest { ... } 
class destImpl2 implements dest { ... }
Run Code Online (Sandbox Code Playgroud)

然后我有一个HashMap<dest,double> destHash. 我想要的是destHash像这样实例化:

destHash = new HashMap<destImpl1,double>();
Run Code Online (Sandbox Code Playgroud)

然后像这样:

destHash = new HashMap<destImpl2,double>();
Run Code Online (Sandbox Code Playgroud)

但代码无法编译。我在这里缺少什么?

And*_*own 5

声明destHash为:

HashMap<? extends dest, Double> destHash
Run Code Online (Sandbox Code Playgroud)

这表示“AHashMapK具有上限的未知类型dest”。

原因是即使Foo<Y>是 的子类型, 也不是 的子类型。然而,表示所有可能的泛型类型调用的集合,其中类型参数是 的子类型。有关更多详细信息,请参阅Java 教程 > 上限通配符Foo<X>YXFoo<? extends X>Foo<T>X

请注意,您需要使用包装类型Double而不是基元作为第二个类型参数。

评论:但是,如果您这样做,您可能无法实际使用它,HashMap因为您将无法将put键和值输入其中。这表明您的设计可能不正确(请参阅通配符使用指南