Map <string,?=“”super =“”number =“”>用于添加和Map <string,?=“”extends =“”“number =”“>用于打印产生错误

时间:2017-05-25 08:16:28

标签: java generics

我已经在这里阅读了几篇关于这个主题的帖子。

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>

2 个答案:

答案 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;

没有编译错误