Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用每个对象的返回类型声明类型间方法';什么课?_Java_Aspectj_Aop - Fatal编程技术网

Java 如何使用每个对象的返回类型声明类型间方法';什么课?

Java 如何使用每个对象的返回类型声明类型间方法';什么课?,java,aspectj,aop,Java,Aspectj,Aop,在我的AspectJ项目中,我有如下代码: public aspect MyAspect { public Object MyInterface.getMyself() { return this; } } public interface MyInterface { } public class MyClassOne implements MyInterface {} public class MyClassTwo implements MyInterfa

在我的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.getimf()
声明为
Object
,而声明为
this.getClass()
或类似的东西,即在适用的情况下注入
MyClassOne
MyClassTwo

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
    }
}
aspect MyAspect{
public的MyInterface.getimf(){
归还本文件;
}  
}
接口MyInterface{
}
类MyClassOne实现MyInterface{}
类MyClass2实现MyInterface{}
班长{
公共静态void main(字符串[]args){
MyClassOne aClassOne=新的MyClassOne().getimf();
MyClassTwo aClassTwo=新的MyClassTwo();
MyClassOne errorClassOne=新的MyClass2().GetIf();//编译错误
MyClassTwo errorClassTwo=新的MyClassOne().GetIf();//编译错误
}
}
仿制药的乐趣!我想答案是直截了当的,但如果这让您感到困惑,请告诉我。

试试这个:

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
    }
}
aspect MyAspect{
public的MyInterface.getimf(){
归还本文件;
}  
}
接口MyInterface{
}
类MyClassOne实现MyInterface{}
类MyClass2实现MyInterface{}
班长{
公共静态void main(字符串[]args){
MyClassOne aClassOne=新的MyClassOne().getimf();
MyClassTwo aClassTwo=新的MyClassTwo();
MyClassOne errorClassOne=新的MyClass2().GetIf();//编译错误
MyClassTwo errorClassTwo=新的MyClassOne().GetIf();//编译错误
}
}

仿制药的乐趣!我想答案是直截了当的,但如果这让您感到困惑,请告诉我。

那么您想在GetIlly()中返回MyClassOne或MyClassII的实例吗?嗯,是的。。。正如我所写的,我不知道代码注入是如何工作的,但我的目标是当从
MyClassOne
的实例调用
getimf()
时,返回
MyClassOne
的实例。当从该类的实例调用
MyClassTwo
时,我知道我可以返回泛型(
t…
),但这并不是我想要的,没有泛型或者为每个实现类创建一个新的ITD,就无法做到这一点。我可以为您编写一个泛型解决方案,我认为这将是一个很好和优雅的解决方案。@Andrew,我很乐意听取您的建议。:)顺便说一句,什么是ITD?那么您想在getMy()中返回MyClassOne或MyClassTwo的实例吗?是的。。。正如我所写的,我不知道代码注入是如何工作的,但我的目标是当从
MyClassOne
的实例调用
getimf()
时,返回
MyClassOne
的实例。当从该类的实例调用
MyClassTwo
时,我知道我可以返回泛型(
t…
),但这并不是我想要的,没有泛型或者为每个实现类创建一个新的ITD,就无法做到这一点。我可以为您编写一个泛型解决方案,我认为这将是一个很好和优雅的解决方案。@Andrew,我很乐意听取您的建议。:)顺便问一下,什么是ITD?