如何在抽象Java类中引用“this”?

时间:2012-09-13 05:54:27

标签: java this abstract-class

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

abstract class MyAbstractClass <MyImplementingClass extends MyAbstractClass> {

    public abstract MyImplementingClass self();
}

我用

在每个子类中覆盖
class MyImplementingClass extends MyAbstractClass<MyImplementingClass> {

    @Override public MyImplementingClass self() {
        return this;
    }
}

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

3 个答案:

答案 0 :(得分:3)

我相信这里的问题是您的self()方法返回MyImplementingClass而不是MyAbstractClass

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

我也不遵循为什么不使用this?它返回对象本身,使用正确的动态类型,无论它在何处被调用。如果需要,可以投射

答案 1 :(得分:1)

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

abstract class MyAbstractClass {

    public MyAbstractClass self() {
        return this;
    }
}

具体课程:

class MyImplementingClass extends MyAbstractClass {

    @Override
    public MyImplementingClass self() {
        return this;
    }
}

这也是您可以覆盖clone()以返回确切类型而非Object的原因:

public class SomeCloneable implements Cloneable {

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

答案 2 :(得分:0)

我相信,你可以返回一个类的newInstance()来表现得像那样

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