如何将对象添加到<! - ?扩展Inteface - >?

时间:2017-01-16 12:35:00

标签: java object generics

--entrypoint

如果有地图:public interface A { int getA(); } public class MyObj implements A { public int getA(){ return 1; } }

如何向此Map<? extends A, String> aMap = new HashMap<>();添加MyObj?或者如何使用aMap类以便它可以在此地图中使用

2 个答案:

答案 0 :(得分:6)

  

如何向此<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <div id="brand">Aston Martin</div> <input id="filter" value="Aston ">添加MyObj

由于密钥类型的上限,你不能这样做。

原因是aMap可能是? extends A。在这种情况下,能够将MyOtherObj implements A类型的键放入地图中是不安全的类型:

MyObj

记住首字母缩略词PECS(详见this question):

  • 制作人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!
  • 消费者extends

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

例如,您可以迭代键(&#34;生成&#34;键):

A

地图只能消费&#34;文字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>更容易。

答案 1 :(得分:2)

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

您必须将地图更改为:

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

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

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