我试图了解为什么此方法的类型擦除不适用于通配符。

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,它允许您声明泛型类型参数的变体。如果编译器知道您的泛型类将始终在协变位置使用该参数,则它可以允许您想要的转换。

09-17 02:18