假设我有一个这样的简单方法来处理两个列表:
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
的声明以允许第一个版本和第二个版本一起工作?
答案 0 :(得分:3)
我很确定Java的类型推断不足以处理统一。
您可以做的是返回某种中间对象,并将呼叫站点更改为:
foo(list1).and(list2)
但是它仍然只能从左到右推断,所以你必须把它称为:
foo(ImmutableList.of(1)).and(ImmutableList.of());
答案 1 :(得分:2)
我预见到这对您造成不便的唯一设置就是当您这么做时。在这种情况下,你可以做一个
private static final ImmutableList<Integer> EMPTYINTLIST = ImmutableList.<Integer>of();
并在通话中使用EMPTYINTLIST
。
答案 2 :(得分: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));