Java 8功能界面模糊引用(这是一个bug吗?)

isa*_*son 16 java generics java-8

我有两个与这些类似的功能:

public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) {
    Out x = f.apply(in);
    return test(in, x);
}

public static <In extends Number, Out extends Number> Out test(In in, Out out) {
    return out;
}
Run Code Online (Sandbox Code Playgroud)

对我来说很明显,他们不能(!)发生冲突,并且呼叫不能模棱两可.但是,对于最新版本的Java 8,以下调用失败:

Test.test(2, Integer::new);
Run Code Online (Sandbox Code Playgroud)

Error:(17, 16) java: reference to test is ambiguous both method <In,Out>test(In,java.util.function.Function<In,Out>) in org.test and method <In,Out>test(In,Out) in org.test match

Test.test(2, new Function<Integer, Number>() {
    @Override
    public Number apply(Integer integer) {
       return 10;
    }
});
Run Code Online (Sandbox Code Playgroud)

Test.test(2, (Function<Integer, Number>) integer -> 10);
Run Code Online (Sandbox Code Playgroud)

工作.

这是编译器中的错误(或者这应该失败吗?)

有关我的设置的更多信息如下

Java版本:

Desktop $ java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)

错误:

Test.java:5: error: reference to test is ambiguous
    Test.test(2, Integer::new);
        ^
both method <In#1,Out#1>test(In#1,Function<In#1,Out#1>) in Test and method   <In#2,Out#2>test(In#2,Out#2) in Test match
where In#1,Out#1,In#2,Out#2 are type-variables:
In#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>)
Out#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>)
In#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2)
Out#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2)
Run Code Online (Sandbox Code Playgroud)

测试程序:

import java.util.function.Function;

public class Test {
  public static void main(String[] args) {
    Test.test(2, Integer::new);
  }

  public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) {
    Out x = f.apply(in);
    return test(in, x);
  }

  public static <In extends Number, Out extends Number> Out test(In in, Out out) {
    return out;
  }
}
Run Code Online (Sandbox Code Playgroud)

由于该问题已被其他人确认,我已将其报告为Oracle的错误.

Dav*_*nco 4

Test.test(2, Integer::new);不应该失败。确实,它对我来说并没有失败。跑步:

C:\Users\David>java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
C:\Users\David>javac -version
javac 1.8.0_20
Run Code Online (Sandbox Code Playgroud)

据我所知,这是最新的。您在什么平台上工作?

事实证明,这是 OSX 上的一个错误(而不是 Windows 上)。如果有人有 *NIX 机器,他们也应该测试 OP 的代码。

  • @isakkarlsson:是的,仍然是一个错误。我的建议是在 http://bugreport.java.com/ 提交错误报告。我会自己做,但我不知道你的操作系统的具体情况。提交后,为了后代,请随时将其链接到此处。好发现! (3认同)
  • 无论如何,使用 ARM 版 JDK 版本“1.8.0_06”时也会出现该错误。 (2认同)