Java通配符-创建Arrays.asList或ImmutableList.of的泛型



我刚刚遇到一个我不太明白的问题。我有以下变量(类字段(:

List<Validator<?, Data>> validators;

现在我想将一些验证器的实例分配给这个列表,然后:

validators = Arrays.asList(validatorsFactory.create(Obj1.class));

其中create方法返回Validator<?, Data>还有一个问题:由于通配符的原因,我需要指定该列表的通用类型。好的,正确的版本是:

validators = Arrays.<Validator<?, Data>>asList(validatorsFactory.create(Obj1.class));

但是,当我添加两个元素而不是一个元素时,我不必指定任何泛型类型。Java如何知道通配符是相同的?

validators = Arrays.asList(
validatorsFactory.create(Obj1.class), validatorsFactory.create(Obj2.class)
);

我对此的理解是,当通配符是方法的参数时,它们都是不同的占位符。同样适用于Guava的:ImmutableList.of

提前感谢

当您在顶级有一个带有通配符的参数(例如Validator<?, Data>(时,您可以将其传递给在通配符所在位置带有类型变量的泛型方法,例如public <T> void foo(Validator<T, Data>)。这称为通配符捕获。

这种情况稍有不同,因为Arrays.asList()采用类型为T的参数。出于某种原因,在您的第一种情况下,它在推断T的类型时保持捕获,因此它推断TValidator<capture #XXX, Data>,而不是您想要的T

在第二种情况下,我猜您有两个参数,都是Validator<?, Data>类型,这在某种程度上使得T不可能被推断为包含捕获,因为这两个通配符将有两个不同的捕获,所以它只是推断TValidator<?, Data>,这正是您最初想要的。

最新更新