【发布时间】:2016-03-15 10:13:27
【问题描述】:
我正在将 Java7 代码移植到 Java8,但遇到了以下问题。 在我的代码库中,我有两种方法:
public static <T> ImmutableSet<T> append(Set<T> set, T elem) {
return ImmutableSet.<T>builder().addAll(set).add(elem).build();
}
public static <T> ImmutableSet<T> append(Set<T> set, Set<T> elemSet) {
ImmutableSet.Builder<T> newSet = ImmutableSet.builder();
return newSet.addAll(set).addAll(elemSet).build();
编译器在以下测试中返回关于方法 append 不明确匹配的错误:
@Test(expected = NullPointerException.class)
public void shouldAppendThrowNullPointerForNullSecondSet() {
ImmutableSet<Integer> obj = null;
CollectionUtils.append(ImmutableSet.of(1), obj);
}
编译器错误:
CollectionUtils 中的 append(java.util.Set,T) 方法和 CollectionUtils 匹配中的 append(java.util.Set,java.util.Set) 方法都对 append 的引用不明确
如何重写这些函数以使用 Java8 引入的类型推断?
【问题讨论】:
-
您可以通过
ImmutableSet<Integer> obj = null; ImmutableSet<Integer> set = ImmutableSet.of(1); append(set, obj);使其工作。 -
无法在 ideone 中重现(使用 HashSet 而不是 ImmutableSet,但从类型推断的角度来看这无关紧要)ideone.com/oT6SbF。
-
@AndyTurner 使用 jdk 1.8.0_51(和 Eclipse Mars.2)确实无法编译。
-
@Tunaki 那么这是 Eclipse Mars.2 的问题,而不是 JDK 1.8.0_51,因为 ideone 声称使用的是 Java 的那个版本?
-
@AndyTurner 我的意思是他们都无法编译这个。我也用真正的
ImmutableSet对此进行了测试,也许这很重要(这与您的 ideone 测试不同)。