我试图理解为什么此方法的类型擦除不适用于通配符。
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)
,它将起作用,但是由于我无法理解的原因,这不适用于通配符。
规则是:A
是-a B
表示G<A>
是-a G<? extends B>
而G<B>
是-a G<? super A>
。