【问题标题】:Java 8 call to generic method is ambiguous [duplicate]Java 8对泛型方法的调用不明确[重复]
【发布时间】: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&lt;Integer&gt; obj = null; ImmutableSet&lt;Integer&gt; 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 测试不同)。

标签: java java-8


【解决方案1】:

您已发现 Java 8 中新的通用目标类型推理改进。其中有一些堆栈溢出问题。 Such as this one.

Java 8 可以根据作为参数传递给它的方法推断泛型的返回类型。因此,当您调用 CollectionUtils.append(ImmutableSet.of(1), obj) 时,Java 8 会尝试从与您的 append 方法之一匹配的静态 of 调用返回一个不可变集。在这种情况下,它可以考虑返回一个ImmutableSet&lt;Object&gt;,而不是你显然想要返回的ImmutableSet&lt;Integer&gt;。然后不清楚你是打电话给append(Set&lt;Object&gt;, Object),还是append(Set&lt;Integer&gt;, Set&lt;Integer&gt;)

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

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

我会坚持自己重命名第二种方法。当其他开发人员尝试使用该库时,它将免去同样的痛苦。

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多