Java 8对generics方法的调用含糊不清

我正在将Java7代码移植到Java8,我想出了以下问题。 在我的代码库中,我有两种方法:

public static  ImmutableSet append(Set set, T elem) { return ImmutableSet.builder().addAll(set).add(elem).build(); } public static  ImmutableSet append(Set set, Set elemSet) { ImmutableSet.Builder newSet = ImmutableSet.builder(); return newSet.addAll(set).addAll(elemSet).build(); 

编译器在以下测试中返回有关方法附加的模糊匹配的错误:

 @Test(expected = NullPointerException.class) public void shouldAppendThrowNullPointerForNullSecondSet() { ImmutableSet obj = null; CollectionUtils.append(ImmutableSet.of(1), obj); } 

编译错误:

对append的引用是不明确的,CollectionUtils中的方法append(java.util.Set,T)和CollectionUtils中的方法append(java.util.Set,java.util.Set)匹配

如何重写这些函数以使用Java8引入的类型推断?

您已经在Java 8中找到了新的通用目标类型推断改进。它上面有一些堆栈溢出问题。 比如这个 。

Java 8可以根据它作为参数传递给的方法推断generics的返回类型。 因此,当您调用CollectionUtils.append(ImmutableSet.of(1), obj) ,Java 8会尝试从与您的某个append方法匹配of调用静态返回一个不可变集。 在这个例子中,它可以考虑返回一个ImmutableSet而不是你明显试图返回的ImmutableSet 。 然后不清楚你是否正在调用append(Set, Object)append(Set, Set)

最简单的解决方案是重命名第二个方法appendAll 。 或者,您可以按照建议的修复方式将您的呼叫更改为:

 CollectionUtils.append(ImmutableSet.>of(1), obj); 

我坚持自己重命名第二种方法。 当他们尝试使用该库时,它将为其他开发人员带来同样的悲痛。