在Java中是否可以在抽象类的方法中使用this
,但作为子类的实例,而不仅仅是抽象类的实例?
abstract class MyAbstractClass <MyImplementingClass extends MyAbstractClass> {
public abstract MyImplementingClass self();
}
我用
在每个子类中覆盖class MyImplementingClass extends MyAbstractClass<MyImplementingClass> {
@Override public MyImplementingClass self() {
return this;
}
}
但我想知道是否有更优雅的方法来做到这一点。特别是,不要求每个子类都覆盖像self()
这样的例程。
答案 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();
}