gpt4 book ai didi

Java 8 功能接口(interface)歧义引用(这是一个错误吗?)

转载 作者:太空狗 更新时间:2023-10-29 22:47:46 26 4
gpt4 key购买 nike

我有两个类似于这些的函数:

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;
}

对我来说,很明显它们不能(!)冲突并且调用不能含糊不清。但是,对于最新版本的 Java 8,以下调用会失败:

Test.test(2, Integer::new);

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;
}
});

Test.test(2, (Function<Integer, Number>) integer -> 10);

工作。

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

下面是关于我的设置的更多信息

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)

错误:

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;
}
}

由于该问题已得到其他人的确认,我已将其作为错误报告给 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)上的错误。如果有人有 *NIX 盒子,他们也应该测试 OP 的代码。

关于Java 8 功能接口(interface)歧义引用(这是一个错误吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25653204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com