--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
类以便它可以在此地图中使用
答案 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");