我刚刚遇到一个我不太明白的问题。我有以下变量(类字段(:
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
的类型时保持捕获,因此它推断T
为Validator<capture #XXX, Data>
,而不是您想要的T
。
在第二种情况下,我猜您有两个参数,都是Validator<?, Data>
类型,这在某种程度上使得T
不可能被推断为包含捕获,因为这两个通配符将有两个不同的捕获,所以它只是推断T
是Validator<?, Data>
,这正是您最初想要的。