如何参考;这";在抽象Java类中?

如何参考;这";在抽象Java类中?,java,this,abstract-class,Java,This,Abstract Class,在Java中,是否可以在抽象类的方法中使用this,而不仅仅是作为抽象类的子类的实例 abstract class MyAbstractClass <MyImplementingClass extends MyAbstractClass> { public abstract MyImplementingClass self(); } 抽象类MyAbstractClass{ 公共抽象MyImplementingClass self(); } 我在我使用的每个子类中都覆盖了

在Java中,是否可以在抽象类的方法中使用
this
,而不仅仅是作为抽象类的子类的实例

abstract class MyAbstractClass <MyImplementingClass extends MyAbstractClass> {

    public abstract MyImplementingClass self();
}
抽象类MyAbstractClass{
公共抽象MyImplementingClass self();
}
我在我使用的每个子类中都覆盖了它

class MyImplementingClass extends MyAbstractClass<MyImplementingClass> {

    @Override public MyImplementingClass self() {
        return this;
    }
}
class MyImplementingClass扩展MyAbstractClass{
@重写公共MyImplementingClass self(){
归还这个;
}
}

但我想知道是否有更优雅的方法来做到这一点。特别是,一个不需要每个子类都覆盖像
self()

这样的例程的类,我相信您可以返回类的
newInstance()

@Override public MyImplementingClass self() {
    return MyImplementingClass.newInstance();
}

我相信,您可以返回类的
newInstance()
,使其表现为那样

@Override public MyImplementingClass self() {
    return MyImplementingClass.newInstance();
}

在Java中重写方法时,可以将返回类型重写为原始类型的子类。此代码完全有效:

abstract class MyAbstractClass {

    public MyAbstractClass self() {
        return this;
    }
}
混凝土等级:

class MyImplementingClass extends MyAbstractClass {

    @Override
    public MyImplementingClass self() {
        return this;
    }
}
这也是为什么您可以覆盖
clone()
以返回准确的类型,而不仅仅是
对象

public class SomeCloneable implements Cloneable {

    @Override
    public SomeCloneable clone() {
        return new SomeCloneable();
    }
}

在Java中重写方法时,可以将返回类型重写为原始类型的子类。此代码完全有效:

abstract class MyAbstractClass {

    public MyAbstractClass self() {
        return this;
    }
}
混凝土等级:

class MyImplementingClass extends MyAbstractClass {

    @Override
    public MyImplementingClass self() {
        return this;
    }
}
这也是为什么您可以覆盖
clone()
以返回准确的类型,而不仅仅是
对象

public class SomeCloneable implements Cloneable {

    @Override
    public SomeCloneable clone() {
        return new SomeCloneable();
    }
}

我认为这里的问题是,您的
self()
方法返回
MyImplementingClass
,而不是
MyAbstractClass

您应该返回一个
MyAbstractClass
,返回对象的动态类型将是相关的


我也不明白你为什么不直接使用这个?它返回具有正确动态类型的对象本身,无论在何处调用它。如果需要,您可以强制转换它。我认为这里的问题是,您的
self()
方法返回
MyImplementingClass
,而不是
MyAbstractClass

您应该返回一个
MyAbstractClass
,返回对象的动态类型将是相关的


我也不明白你为什么不直接使用这个?它返回具有正确动态类型的对象本身,无论在何处调用它。如果需要

语法错误,可以强制转换它?您能显示编译器不接受的代码吗?我认为这里的问题是您的
self()
方法返回
MyImplementingClass
,而不是
MyAbstractClass
。您应该返回一个
MyAbstractClass
,返回对象的动态类型将是相关的。我也不明白你为什么不直接使用这个?它返回具有正确动态类型的对象本身,无论在何处调用它。如果你需要的话,你可以把它投得很好。这似乎确实是个问题。如果你能将上述内容作为答案发布,我可以接受它并结束主题。“…作为手头子类的实例,而不仅仅是抽象类的实例?”这就是
这个
已经是的。它始终是动态的实际类型,而不是当前封闭类的类型。语法错误?您能显示编译器不接受的代码吗?我认为这里的问题是您的
self()
方法返回
MyImplementingClass
,而不是
MyAbstractClass
。您应该返回一个
MyAbstractClass
,返回对象的动态类型将是相关的。我也不明白你为什么不直接使用这个
?它返回具有正确动态类型的对象本身,无论在何处调用它。如果你需要的话,你可以把它投得很好。这似乎确实是个问题。如果你能将上述内容作为答案发布,我可以接受它并结束主题。“…作为手头子类的实例,而不仅仅是抽象类的实例?”这就是
这个
已经是的。它始终是动态的实际类型,而不是当前封闭类的类型。