返回带generics的对象子类

使用抽象类,我想定义一个为子类返回“this”的方法:

public abstract class Foo { ... public  T eat(String eatCake) { ... return this; } } public class CakeEater extends Foo {} 

我希望能够做到这样的事情:

 CakeEater phil = new CakeEater(); phil.eat("wacky cake").eat("chocolate cake").eat("banana bread"); 

可以说香蕉面包会抛出IllegalArgumentException,并显示消息“Not a cake!”

 public abstract class Foo> // see ColinD's comment { public T eat(String eatCake) { return (T)this; } } public class CakeEater extends Foo { public void f(){} } 

编辑

要求子类以某种方式表现超出静态类型可以检查的范围是没有问题的。 我们一直这样做 – 简明英语的页面和页面指定你如何编写子类。

另一个提出的解决方案,具有协变返回类型,必须做同样的事情 – 要求子类实现者,简单地说,返回它的类型。 静态类型无法指定该要求。

从客户的角度来看,这种有品味的方法(通常是你想要采用的方法)是使用协变返回类型,这是为了支持generics,正如Michael Barker所指出的那样。

添加getThis方法的角色稍微不那么雅致,但更有品味:

 protected abstract T getThis(); public  T eat(String eatCake) { ... return getThis(); } 

我认为您不需要genericsJava 5(及更高版本)具有协变返回类型,例如:

 public abstract class Foo { ... public Foo eat(String eatCake) { ... return this; } } public class CakeEater extends Foo { public CakeEater eat(String eatCake) { return this; } } 

我之前用来实现类似行为的方法是让子类将其类型传递给(generified)父类型的构造函数。 通过免责声明,我正在动态生成子类,并且inheritance是让我的代码生成简单有点欺骗,因为我的第一直觉是尝试完全删除扩展关系。