繁体   English   中英

如何添加对象 <? extends Interface> ?

[英]How can I add an object to <? extends Interface>?

public interface A {
    int getA();
}

public class MyObj implements A {
    public int getA(){
        return 1;
    }
}

如果有地图: Map<? extends A, String> aMap = new HashMap<>(); Map<? extends A, String> aMap = new HashMap<>();

我如何添加一个MyObj这个aMap 或者MyObj类应该如何才能在这个地图中工作

如何将MyObj添加到此aMap

你不能,因为键类型的上限。

原因是? extends A ? extends A可以是MyOtherObj implements A 在这种情况下,能够将MyObj类型的MyObj放入映射中将是类型不安全的:

Map<MyOtherObj, String> anotherMap = new HashMap<>();

Map<? extends A, String> aMap = anotherMap;
aMap.put(new MyObj(), "");  // Can't do this; but if you could...

MyOtherObj obj = anotherMap.keySet().iterator().next();  // ClassCastException!

记住首字母缩略词PECS(更多细节请参阅此问题 ):

  • 制片人extends
  • 消费者super

换句话说, Map<? extends A, String> Map<? extends A, String>只能用于生成 A实例,它不能使用/接受A实例。

例如,您可以迭代键(“生成”键):

for (A a : aMap.keySet()) { ... }

地图只能“消耗”文字null

aMap.put(null, "");

因为null可以毫无例外地转换为任何类型。 但是在只有一个键的地图中没有太多用处 - 您也可以直接存储该值。

要做到这一点的唯一方法类型安全是把实例MyObj成通过它,你知道的参考地图接受MyObj的实例:

Map<MyObj, String> safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");

Map<? extends A, String> aMap = safeMap;

要么

Map<A, String> safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");

Map<? extends A, String> aMap = safeMap;

但你应该考虑根本没有通配符类型的地图; Map<MyObj, String>Map<A, String>更容易。

这是不可能的。 您的编译器不允许它。

您必须将地图更改为:

Map<A, String> aMap = new HashMap<>();

在此之后,您可以使用put向其添加元素:

aMap.put(new MyObj(), "myObject");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM