1

在我的 AspectJ 项目中,我有如下代码:

public aspect MyAspect {
    public Object MyInterface.getMyself() {
        return this;
    }
}


public interface MyInterface {
}

public class MyClassOne implements MyInterface {}
public class MyClassTwo implements MyInterface {}

那么,AspectJ 是如何在类型间声明中注入代码的呢?另外,有没有办法,而不是声明MyInterface.getMyself()'s Object,声明为this.getClass()或类似的东西,即注入MyClassOneMyClassTwo适用的地方?

4

1 回答 1

1

尝试这个:

aspect MyAspect {
    public S MyInterface<S>.getMyself() {
        return (S) this;
    }  
}

interface MyInterface<T extends MyInterface<T>> {
}

class MyClassOne implements MyInterface<MyClassOne> {}
class MyClassTwo implements MyInterface<MyClassTwo> {}

class Main {
    public static void main(String[] args) {
        MyClassOne aClassOne = new MyClassOne().getMyself();
        MyClassTwo aClassTwo = new MyClassTwo().getMyself();
        MyClassOne errorClassOne = new MyClassTwo().getMyself(); // compile error
        MyClassTwo errorClassTwo = new MyClassOne().getMyself(); // compile error
    }
}

泛型的乐趣!我认为答案是直截了当的,但如果这让您感到困惑,请告诉我。

于 2013-08-26T22:13:33.800 回答