Подтвердить что ты не робот

Функциональная ссылка на Object.clone() не компилируется

Компиляция

import java.util.concurrent.Callable;

class Ideone
{
    Callable<?> x = super::clone;
}

с использованием Oracle JDK дает:

Main.java:6: error: incompatible types: invalid method reference
    Callable<?> x = super::clone;
                    ^
    clone() has protected access in Object

который не имеет смысла, поскольку класс должен иметь доступ к своим защищенным родительским методам. Это выражение отлично работает в компиляторе Eclipse.

Кроме того, () -> super.clone() компилируется отлично....

Это ошибка?

4b9b3361

Ответ 1

super на самом деле не является выражением, и там нет статического типа. super.foo() имеет тот же доступ, что и this.foo(); это просто так, что вызов метода переводится по-разному в байтовый код, как "супер-вызов", в отличие от "обычного вызова".

JLS не очень ясно говорит об этом; например в разделе защищенный доступ форма super.protectedMember не упоминается; но, очевидно, эта форма должна обсуждаться в JLS; и он должен быть доступен. (В разделе показано, что X::m и X.m следует обращаться с тем же правом доступа w.r.t.)

В разделе ссылка метода, формулировка также нечеткая; тем не менее, super::clone должен быть доступен теми же способами, что и super.clone().

Создан отчет об ошибке: JDK-8139836: "Нельзя использовать ссылку на метод super:: x при защите x" . Его текущий статус заключается в том, что он будет исправлен в Java 9.