嵌套类型的通配符

时间:2019-11-22 22:07:59

标签: java generics types wildcard

我试图理解为什么此方法的类型擦除不能与通配符一起使用。

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),它将起作用,但是由于我无法理解的原因,这不适用于通配符。

1 个答案:

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