Возможен ли вызов метода суперинтерфейса по умолчанию?

Скажем, у меня есть два класса, A и B:

class A
{
    void method()
    {
        System.out.println("a.method");
    }
}
class B extends A
{
    @Override
    void method()
    {
        System.out.println("b.method");
    }
}

После создания экземпляра B как b я могу вызывать метод B как b.method(). Я также могу заставить метод B вызывать метод A с помощью super.method(). Но что, если A — это интерфейс:

interface A
{
    default void method()
    {
        System.out.println("a.method");
    }
}
class B implements A
{
    @Override
    void method()
    {
        System.out.println("b.method");
    }
}

Можно ли как-нибудь заставить метод B вызывать метод A?


person The Guy with The Hat    schedule 07.04.2014    source источник


Ответы (1)


Да, ты можешь. Использовать

A.super.method();

Состояние JLS

Если форма TypeName . super . [TypeArguments] Identifier, то:

Это ошибка времени компиляции, если TypeName не обозначает ни класс, ни интерфейс.

Если TypeName обозначает класс C, то класс для поиска является надклассом C.

Это ошибка времени компиляции, если C не является лексически охватывающим объявлением типа текущего класса или если C является объектом класса.

Пусть T будет объявлением типа, непосредственно заключающим в себе вызов метода. Это ошибка времени компиляции, если T является объектом класса.

В противном случае TypeName обозначает интерфейс для поиска, I.

person Sotirios Delimanolis    schedule 07.04.2014