我已经阅读了这里有关此主题的几篇文章。
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
才能将多个子类型插入到同一个 map 中。
但是说到打印。我认为使用 extends
就足够了,因为 PECS(生产者扩展)
相反,我得到了这个:
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>
最佳答案
在这两种情况下Number
就足够了,而且是最充分的。
如前所述super
没有意义;您也可以编写 Object。
Map<String, Number> map = new HashMap<>();
使用此功能,您可以将 Number 或 Number 的子级放入 map 中。 或者从 map 中获取 Number 或 Number 的父级。
现在如果你想使用:
public static void print(Map<String, ? extends Number> map) {
你不能输入 Double
(或其他)进入map
因为实际的 map 参数可能是 Map<String, Integer>
。因此Map<String, Number>
.
由于java的类型系统不是很强/表达力很强,一个好的规则是保留extends
用于元级别构造(=当您需要它们时)。对于简单的数据结构,PECS 遵循数据流。
关于java - map <字符串,? super Number> 用于添加和 Map<String, ?用于打印的扩展 Number> 会产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44175613/