【发布时间】:2018-06-21 06:27:03
【问题描述】:
考虑以下代码:
public class A {
public static void main(String[] args) {
Runnable test1 = ((I)(new I() {}))::test; // compiles OK
Runnable test2 = ((new I() {}))::test; // won't compile
}
interface I {
private void test() {}
}
}
我不太明白...我知道test() 方法是private。但是,如果我们将匿名类强制转换为它的接口((I)(new I() {})),会发生什么变化?更准确地说,我希望看到一个允许该技巧的特定 JLS 点。
P.S. 我已将其报告为编译器的错误(ID:9052217)。在我看来,Runnable test2 = ((new I() {}))::test; 在这种特殊情况下应该编译得很好。
P.P.S. 到目前为止,根据我的报告创建了一个错误:https://bugs.openjdk.java.net/browse/JDK-8194998。可能会以“无法修复”或其他方式关闭。
【问题讨论】:
-
((new I() {}))::test这个丑陋的代码是什么,它是从哪里来的? -
@insidesin 你想怎么做? :)
-
您的问题标题存在误导性错误。 “带有私有方法的接口”显然是
I,它既不是,也不是功能接口,也不是“作为功能接口”使用的。 -
@JarrodRoberson 您不能将这些答案推断为接口中的私有方法作为绝对新功能
-
标题建议:“私有接口方法的方法引用”。方法引用将被转换为功能接口的实例(在运行时),但这不是这个函数的重点。如果 Java 中有真正的函数类型,那么问题是相同的,因此方法引用在没有函数接口的情况下也能正常工作。
标签: java language-lawyer java-9