Java 嵌套类型的通配符

Java 嵌套类型的通配符,java,generics,types,wildcard,Java,Generics,Types,Wildcard,我试图理解为什么这个方法的类型擦除不能使用通配符 public boolean foo(TypeA<TypeB<?>, TypeB<?>> bar) { return true; } // instantiate an object TypeA<TypeB<TypeC>, TypeB<TypeC>> somethingOtherThanFooBar = ...; // TypeA<TypeB<?>

我试图理解为什么这个方法的类型擦除不能使用通配符

public boolean foo(TypeA<TypeB<?>, TypeB<?>> bar) {
    return true;
}

// instantiate an object
TypeA<TypeB<TypeC>, TypeB<TypeC>> somethingOtherThanFooBar = ...;

// TypeA<TypeB<?>, TypeB<?>> cannot be applied to TypeA<TypeB<TypeC>, TypeB<TypeC>>
foo(somethingOtherThanFooBar);
public boolean foo(TypeA>bar){
返回true;
}
//实例化一个对象
键入除foobar=…]以外的其他内容。。。;
//TypeA>不能应用于TypeA
foo(foobar以外的东西);

我知道如果方法签名是
pulic boolean foo(TypeA bar)
,它会起作用,但这不适用于通配符,原因我不明白。

规则是:
a
is-a
B
意味着
G
is-a
G
,因此
  • TypeA
    is-a
    TypeA>
  • 没有允许您从参数类型获取参数类型的类型规则

    您应该查看Scala,它允许您声明泛型类型参数的差异;如果编译器知道您的泛型类总是使用协变位置的参数,那么它可以允许您想要的转换