首页 > 解决方案 > 嵌套类型的通配符

问题描述

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

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

标签: javagenericstypeswildcard

解决方案


规则是:Ais-aB暗示G<A>is-aG<? extends B>G<B>is-a G<? super A>

所以

  • TypeCis-a Object,因此
  • TypeB<TypeC>is-a TypeB<?>,因此
  • TypeA<TypeB<TypeC>>是一个TypeA<? extends TypeB<?>>

没有类型规则允许您从参数类型获取参数类型。

你应该看看 Scala,它允许你声明泛型类型参数的变化;如果编译器可以知道您的泛型类将始终使用协变位置的参数,它可以允许您想要的转换。


推荐阅读