7

假设我有一个像这样的简单方法来处理两个列表:

public static <B> void foo(List<B> list1, List<B> list2) {
}

假设我想这样称呼它:

foo(ImmutableList.of(), ImmutableList.of(1));

这不会编译,因为javac它不够聪明,无法弄清楚我正在尝试创建两个整数列表。相反,我必须写:

foo(ImmutableList.<Integer>of(), ImmutableList.of(1));

我应该如何更改声明foo以允许第一个版本和第二个版本一样工作?

4

3 回答 3

3

我很确定 Java 的类型推断功能不足以处理统一。

您可以做的是返回某种中间对象,并将调用站点更改为:

foo(list1).and(list2)

但是它仍然只能从左到右推断,所以你必须把它称为:

foo(ImmutableList.of(1)).and(ImmutableList.of());
于 2012-04-19T04:08:22.217 回答
2

我认为这会给您带来不便的唯一情况是您经常这样做。在这种情况下,您可以制作一个

private static final ImmutableList<Integer> EMPTYINTLIST = ImmutableList.<Integer>of();

EMPTYINTLIST在您的通话中使用您的。

于 2012-04-19T04:34:03.530 回答
1

您可以通过简单地更改参数的通用信息来做到这一点,两个版本都可以使用。即

  public static <B> void foo(List<? super B> list1, List<B> list2) {


        }

现在两个版本都可以使用。

foo(ImmutableList.of(), ImmutableList.of(1));
foo(ImmutableList.<Integer>of(), ImmutableList.of(1));
于 2012-04-19T04:24:21.580 回答