【问题标题】:Generics issue with JavaJava的泛型问题
【发布时间】:2013-08-26 08:06:24
【问题描述】:

这是我的代码 sn-p:

Map<String, ? extends Object> data = this.aub.getData();
//... some code ...
data.put("ip_macs", new LinkedList<Object>()); //gets error

我在标记行得到的错误是(消息来自 Eclipse IDE):

类型Map中的put(String, capture#3-of ? extends Object)方法不适用于参数(String, LinkedList)

有人知道为什么吗?只要LinkedListObject 的子类型,我认为该错误没有任何理由出现。我在哪里误解了这个问题?

【问题讨论】:

    标签: java generics map


    【解决方案1】:

    泛型类型指定为

    Map<String, Object> data = this.aub.getData();
    data.put("ip_macs", new LinkedList<Object>()); // Compiles
    

    当您说Map&lt;String, ? extends Object&gt; 时,它表示Map,其键类型为String,值扩展Object,但其类型为未知?。由于类型未知,因此在此处插入 LinkedList 对象是不安全的。

    基本上,编译器试图阻止这种情况:

    Map<String, String> mapOfStrings = new HashMap<String, String>();
    mapOfStrings.add("string", "value");
    
    Map<String, ? extends Object> map = mapOfStrings; // Compiles
    map.add("string", 1); // ERROR!
    

    如果允许,您只是绕过了泛型提供的类型安全。

    【讨论】:

    • 或者具体来说:您之前可以这样做:例如data = new HashMap&lt;String, BigDecimal&gt;();。只有Object x = data.get("") 可能。
    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多