我试图理解为什么此方法的类型擦除不能与通配符一起使用。
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);
我知道,如果方法签名为pulic <T, U> boolean foo(TypeA<TypeB<T>, TypeB<U>> bar)
,它将起作用,但是由于我无法理解的原因,这不适用于通配符。
答案 0 :(得分:1)
规则是:A
是-a B
意味着G<A>
是-a G<? extends B>
和G<B>
是-a G<? super A>
。 / p>
所以
TypeC
是-Object
的TypeB<TypeC>
是-TypeB<?>
的TypeA<TypeB<TypeC>>
是-TypeA<? extends TypeB<?>>
。没有类型规则可以让您从参数类型转换为参数类型。
您应该签出Scala,它可以让您声明泛型类型参数的差异;如果编译器知道您的通用类将始终在协变位置使用该参数,则它可以允许您想要的转换。