我刚遇到一个我不太了解的问题。 我有以下变量(类字段):
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)
);
我对此的理解是,当所有通配符是方法的参数时,它们都是不同的占位符。
同样适用于番石榴:ImmutableList.of
预先感谢
答案 0 :(得分:0)
当您的参数在顶层带有通配符时,例如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>
,这是您首先要的。