Рассмотрим следующий код:
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()
частный. Но что изменилось, если мы включили анонимный класс в свой интерфейс ((I)(new I() {}))
? Точнее, я хотел бы видеть конкретную точку JLS, которая допускает этот трюк.
P.S. Я сообщил об этом как о компиляторе (ID: 9052217). Мне кажется, что Runnable test2 = ((new I() {}))::test;
должен быть скомпилирован в этом конкретном случае.
P.P.S. До сих пор была создана ошибка, основанная на моем отчете: https://bugs.openjdk.java.net/browse/JDK-8194998. Возможно, он будет закрыт, поскольку "не исправит" или что-то еще.