我已经在这里阅读了几篇关于这个主题的帖子。
This是一个特别好的帖子
我以为我理解 PECS - 概念,并尝试设置一个小例子来测试它。
import java.util.Map;
import java.util.HashMap;
class Test {
public static void main(String[] args) {
Map<String, ? super Number> map = new HashMap<>();
map.put("int", 1);
map.put("double", 1.0);
map.put("long", 100000000000L);
print(map);
}
public static void print(Map<String, ? extends Number> map) {
map.forEach((k, v) -> System.out.printf("Key: %s, Val: %s%n", k, v));
}
}
我知道我需要使用super
才能将多个子类型插入到同一个地图中。
但是在印刷方面。我认为使用extends
就足够了,因为 PE CS(制片人扩展)
相反,我得到了这个:
Error:(12, 15) java: incompatible types: java.util.Map<java.lang.String,capture#1 of ? super java.lang.Number> cannot be converted to java.util.Map<java.lang.String,? extends java.lang.Number>
答案 0 :(得分:1)
在这两种情况下Number
都足够了,并且是最充足的。
正如所说super
没有意义;你也可以编写对象。
Map<String, Number> map = new HashMap<>();
通过这个,您可以将Number或Number of child放入地图中。 或者从地图中获取Number或父级Number。
现在,如果您将使用:
public static void print(Map<String, ? extends Number> map) {
你不能将Double
(或其他)放入map
,因为实际的地图参数可能是Map<String, Integer>
。因此Map<String, Number>
。
由于java的类型系统不是非常强大/富有表现力,因此一个好的规则是保持extends
元级别构造(=当你需要它们时)。对于简单的数据结构, PECS 来自数据流。
答案 1 :(得分:0)
这是因为
Map<String, ? super Number> map
可能包含任何值,请尝试此
Map<String, Object> map1 = new HashMap<>();
map1.put("1", "2");
Map<String, ? super Number> map = map1;
没有编译错误