【问题标题】:Method in the type Map<String,capture#1-of ? extends Object> is not applicableMap<String,capture#1-of 类型中的方法?扩展对象> 不适用
【发布时间】:2014-01-29 05:43:52
【问题描述】:

由于接口,我实现了以下JAVA 方法:

public String importDocument(ImportSource source, Map<String, ? extends Object> paramMap);

当我尝试执行以下操作时,我收到了编译警告。 片段:

paramMap.put("Key", "Value");

错误:

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

为什么?

【问题讨论】:

    标签: java generics compiler-errors


    【解决方案1】:
    ? extends Object
    

    您正在使用通用通配符。您不能执行添加操作,因为类类型不确定。您不能添加/放置任何东西(null 除外)。

    有关使用通配符的更多详细信息,您可以参考 oracle docs

    Collection<?> c = new ArrayList<String>();
    c.add(new Object()); // Compile time error
    

    因为我们不知道 c 的元素类型代表什么,所以我们不能给它添加对象。 add() 方法接受 type E 的参数,即集合的元素类型。当实际类型参数为?时,它代表一些unknown type。我们传递给 add 的任何参数都必须是这种未知类型的子类型。因为我们不知道那是什么类型,所以我们不能传入任何东西。The sole exception is null, which is a member of every type

    【讨论】:

    • 这是否意味着,如果我需要为参数添加一个值,我必须创建一个包含所有值的新映射并使用它来代替?
    • 如果要添加参数,请不要使用通配符,请改用Map&lt;String,Object&gt;
    • 无论如何? extends Object 毫无意义,因为每个类都有资格作为参数。
    • 我无法更改它,它是一个定义明确的接口,我必须按原样使用。但是我真的不明白。 Map&lt;String, ?&gt;Map&lt;String, ? extends Something&gt;有什么区别
    • @Emaborsa 你可能想看看这个question
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多