Невозможно переопределить метод и не может получить доступ к полю при использовании идиомы «Предоставление реализации интерфейса по умолчанию» - PullRequest
1 голос
/ 21 августа 2011

Вот код:
IDefaultInterface.aj:

public interface IDefaultInterface {
    public void m1();   
    static aspect Impl{
        public int f1;
        public void IDefaultInterface.m1(){

        }
    }
}

DefaulstInterfaceClass.java:

public class DefaultInterfaceClass implements IDefaultInterface {

    @Override
    public void m1() {

    }

    void mm() {

        f1 = 9;
    }
}

Во втором фрагменте кода я пытаюсьпереопределить метод m1 () и получить доступ к полю f1.Компилятор не позволяет ни один.
Как преодолеть эти ограничения?

Дополнительные мысли.Я бы не удивился, если бы в «AspectJ in action» 2 редакции не говорилось об использовании этой идиомы, что эффект должен быть таким же, как «расширение реализации по умолчанию для обоих (если в Java разрешено множественное наследование)».Я считаю, что множественное наследование связано с C ++ для большинства.Так почему бы не указать семантику, к которой привыкли люди?

Ответы [ 2 ]

0 голосов
/ 22 августа 2011

Прежде всего я ошибся в декларации f1.Это должно быть

public int IDefaultInterface.f1;

. Это решает проблему поля доступа.

Вторая проблема решается с помощью следующего кода:

public interface IDefaultInterface {
public void m1();   
public static interface Impl extends IDefaultInterface{
    static aspect Implementation{
        public int IDefaultInterface.Impl.f1;
        public void IDefaultInterface.Impl.m1(){

        }

    }
}
}

И затем:

 public class DefaultInterfaceClass implements IDefaultInterface.Impl ....
0 голосов
/ 21 августа 2011

Я не бегло говорю в AspectJ, но вижу пару сомнительных вещей: ваш аспект пытается определить неабстрактный метод в интерфейсе, а ваш класс пытается получить доступ к полю f1, как если бы он владел этим полем , когда вы объявили f1 на аспекте. Я не совсем уверен, что вы пытаетесь сделать здесь, но я не думаю, что вы делаете это правильно.

...