【发布时间】:2015-03-19 02:09:54
【问题描述】:
import java.util.function.*;
class Test {
void test(int foo, Consumer<Integer> bar) { }
void test(long foo, Consumer<Long> bar) { }
void test(float foo, Consumer<Float> bar) { }
void test(double foo, Consumer<Double> bar) { }
}
当我用javac -Xlint Test.java 编译它时,我收到了一些警告:
Test.java:4: warning: [overloads] test(int,Consumer<Integer>) in Test is potentially ambiguous with test(long,Consumer<Long>) in Test
void test(int foo, Consumer<Integer> bar) { }
^
Test.java:6: warning: [overloads] test(float,Consumer<Float>) in Test is potentially ambiguous with test(double,Consumer<Double>) in Test
void test(float foo, Consumer<Float> bar) { }
^
2 warnings
如果我将Consumer 更改为Supplier,警告就会消失。这个程序没有警告:
import java.util.function.*;
class Test {
void test(int foo, Supplier<Integer> bar) { }
void test(long foo, Supplier<Long> bar) { }
void test(float foo, Supplier<Float> bar) { }
void test(double foo, Supplier<Double> bar) { }
}
这是为什么呢?这个警告是什么意思?这些方法如何模棱两可?抑制警告是否安全?
【问题讨论】:
-
当您尝试调用警告函数时会发生什么?
-
看来只有在以下情况下才会发出警告:它是一个功能接口(即消费者、供应商),并且 b。任何接口的方法都包含任何参数...作为测试,我制作了自己的 Consumer/Supplier 接口副本并与它们一起玩弄。遗憾的是,我对 Java 函数了解得不够多,无法知道为什么会为此产生警告。
-
更正:A 点不正确,它不需要是功能接口,只定义了一个(非默认)方法的任何接口(类不产生警告)。此外,我已将 test(int, Consumer) 的参数更改为几乎不可能模棱两可的参数,例如 test(Object, Consumer) vs. test(Map, Consumer) 但仍然抛出警告。因此,除非您使用一些非常古怪的编程,否则我真的认为您无需担心这一点。
-
@Kai:
interface有一个确切的抽象方法是一个函数式接口。没有其他标准。 -
@Holger 是的,直到今天才研究 lambda,我发现 Oracle 的文章写得很好:Java 8: Lambdas, Part 1, Java 8: Lambdas, Part 2
标签: java java-8 compiler-warnings overloading functional-interface