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

时间:2018-07-13 05:16:37

标签: java generics wildcard guava

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

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

预先感谢

1 个答案:

答案 0 :(得分:0)

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

这种情况有些不同,因为Arrays.asList()的参数类型为T。由于第一种情况的某种原因,在推断T的类型时它将保留捕获,因此它推断TValidator<capture #XXX, Data>,而不是T你想要的。

在您的第二种情况下,我猜测您有两个参数(均为Validator<?, Data>类型),以某种方式无法推断T包含捕获,因为这两个通配符会有两次不同的捕获,因此它只是推断TValidator<?, Data>,这是您首先要的。