Java8函数接口不明确的引用(这是一个bug吗?)

Java8函数接口不明确的引用(这是一个bug吗?),java,generics,java-8,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 ou

我有两个类似的功能:

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;
}
带有
错误:(17,16)java:对测试的引用不明确
org.test中的方法测试(In,java.util.function.function)和org.test中的方法测试(In,Out)都匹配

错误:

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)
Test.java:5:错误:对测试的引用不明确
Test.Test(2,整数::新);
^
测试中的方法测试(In#1,功能)和测试中的方法测试(In#2,Out#2)匹配
其中In#1、Out#1、In#2、Out#2是类型变量:
In#1扩展了方法测试中声明的数字(In#1,函数)
Out#1扩展方法测试中声明的数字(in#1,函数)
In#2扩展方法测试中声明的数字(In#2,Out#2)
Out#2扩展了方法测试中声明的数字(in#2,Out#2)
测试程序:

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;
  }
}
import java.util.function.function;
公开课考试{
公共静态void main(字符串[]args){
Test.Test(2,整数::新);
}
公共静态输出测试(输入,功能f){
Out x=f。应用(in);
返回试验(in,x);
}
公共静态输出测试(输入、输出){
返回;
}
}

由于该问题已被其他人确认,我已将其作为一个bug报告给Oracle。

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
据我所知,这是最近的一次。你在哪个平台上工作


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

我也有同样的问题,但我尝试了以下方法:

Test.test(2, Function.identity() ); // OK
Test.test(2, val -> 2L ); // FAIL
Test.test(2, Function.<Integer>identity().andThen(a -> a * 2)); // OK
Test.<Integer,Long>test(2, val -> 2L ); // OK
Test.test(2, (final Integer a) -> a* 2 ); // FAIL
Test.Test(2,Function.identity());//好啊
测试。测试(2,val->2L);//失败
Test.Test(2,Function.identity(),然后(a->a*2));//好啊
测试。测试(2,val->2L);//好啊
测试。测试(2,(最终整数a)->a*2);//失败
虽然这在Javac(Debian-Wheezy+jdk1.8.020x64)中失败,但它在Eclipse中运行良好


另一方面,我想这是一个类型推断问题。您可能应该填写一份bug报告。

Test.Test(2,(函数)Integer::new)
适合我。你的方法对我来说也失败了(
java-version
给了我
1.8.0
),谢谢!看来我已经在OSX上安装了
javac1.8.0\u05
。(用更多信息更新了我的问题)@Isakkarsson:那肯定是个bug。谢天谢地,javac的最新版本(1.8.020)修复了它。可能是在windows上。我刚刚更新到
javac-version
javac1.8.0\u20
。错误仍然存在。@Isakkarsson:是的,那还是个bug。我的建议是在提交一份bug报告。我会自己做,但我不知道你的操作系统的细节。提交后,为了子孙后代,请随意将其链接到此处。好发现!值得一提的是,在使用JDK For ARM的版本
1.8.0_06
时,也会发生错误。
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)
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;
  }
}
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
Test.test(2, Function.identity() ); // OK
Test.test(2, val -> 2L ); // FAIL
Test.test(2, Function.<Integer>identity().andThen(a -> a * 2)); // OK
Test.<Integer,Long>test(2, val -> 2L ); // OK
Test.test(2, (final Integer a) -> a* 2 ); // FAIL