无法使用通配符编译相关的Java Generics参数

ite*_*tor 7 java generics nested-generics

以下小Java示例将无法编译为不明原因:

package genericsissue;

import java.util.ArrayList;
import java.util.List;

interface Attribute<V> {}

interface ListAttribute extends Attribute<List<?>> {}

public class Context {
    public <T, A extends Attribute<T>> void put(Class<A> attribute, T value) {
        // implementation does not matter for the issue
    }

    public static void main(String[] args) {
        Context ctx = new Context();
        List<?> list = new ArrayList<String>();
        ctx.put(ListAttribute.class, list);
    }
}
Run Code Online (Sandbox Code Playgroud)

带有ctx.put的行会产生以下错误:

Context.java:18: <T,A>put(java.lang.Class<A>,T) in genericsissue.Context cannot be applied to (java.lang.Class<genericsissue.ListAttribute>,java.util.List<capture#35 of ?>)
Run Code Online (Sandbox Code Playgroud)

如果没有通配符工作,属性模式工作正常.

是否有任何解释为什么编译器不接受通配符键入的值?

Arn*_*lle 3

代替

public <T, A extends Attribute<T>>
Run Code Online (Sandbox Code Playgroud)

public <T, A extends Attribute<? super T>>
Run Code Online (Sandbox Code Playgroud)

  • 我认为我们可以假设这是可以的,因为你必须记住“value”已经可以是“T”的任何子类。因此,如果“value”是“String”,则“A”可以是“Attribute&lt;String&gt;”、“Attribute&lt;CharSequence&gt;”或“Attribute&lt;Object&gt;”。唯一能阻止的是从“A”*产生*一个“T”,这似乎是合理的。 (2认同)