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的错误.
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 的代码。