Java Generics:通过两个参数推断类型

Der*_*urn 7 java generics

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

public static <B> void foo(List<B> list1, List<B> list2) {
}
Run Code Online (Sandbox Code Playgroud)

并且假设我想这样称呼它:

foo(ImmutableList.of(), ImmutableList.of(1));
Run Code Online (Sandbox Code Playgroud)

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

foo(ImmutableList.<Integer>of(), ImmutableList.of(1));
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*den 3

我很确定 Java 的类型推断不够强大,无法处理统一。

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

foo(list1).and(list2)
Run Code Online (Sandbox Code Playgroud)

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

foo(ImmutableList.of(1)).and(ImmutableList.of());
Run Code Online (Sandbox Code Playgroud)