我试图了解为什么此方法的类型擦除不适用于通配符。
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
is -a B
表示G<A>
is -a G<? extends B>
和G<B>
is-a G<? super A>
。
所以TypeC
是-a Object
,因此TypeB<TypeC>
是-a TypeB<?>
,因此TypeA<TypeB<TypeC>>
是-a TypeA<? extends TypeB<?>>
。
没有类型规则可以让您从参数类型转换为参数类型。
您应该签出Scala,它允许您声明泛型类型参数的变体。如果编译器知道您的泛型类将始终在协变位置使用该参数,则它可以允许您想要的转换。