通过超类返回与类名相同的数据类型?

Hat*_*end 1 java oop

我有一个abstract class有一种abstract方法.我想此方法return相同的数据类型,其重写方法的类,而无需强制转换的结果create或具有使在每个子类的新方法声明.我希望它可以从父类中无缝地声明.

我希望该方法返回一个对象,其数据类型与调用它的类相同.

编辑:我删除了印刷品,因为人们对我的要求感到困惑

abstract class A
{
   public abstract ... create();
}

class B extends A
{
   @override
   public ... create()
   {
      return new B...;
   }
}

class C extends A
{
   @override
   public ... create()
   {
      return new C...;
   }
}
Run Code Online (Sandbox Code Playgroud)

这样

B x1 = new B();
B x2 = x1.create();
// Since create was called on a B object
// a B object is returned, NOT AN "A" object

C y1 = new C();
C y2 = y1.create();
// create makes a C object this time,
// because it's called on a C object

// Problem: create() returns A object, even when
// called from class B or C.
// I want create() to return a B object if called from a B object.
Run Code Online (Sandbox Code Playgroud)

这会是一个好方法吗?谢谢.

And*_*ner 5

我不再认为这是正确的答案.这是一个答案,但过于复杂.看到我的其他答案.

Java的泛型中没有"自我"类型的概念.你能做的最好就是使用自我限制的泛型:

abstract class A<T extends A<T>>
{
   public abstract T create();
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的子类中:

class B extends A<B>
{
   @override
   public B create()
   {
      return new B...;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 打我.幸运的是我在开始写下类似的内容之前看到了你的答案;-) (2认同)