编程语言
首页 > 编程语言> > java – 使用泛型返回对象子类

java – 使用泛型返回对象子类

作者:互联网

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

public abstract class Foo {
    ...
    public <T extends Foo> 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<T extends Foo<T>>  // see ColinD's comment
{
    public T eat(String eatCake) 
    {
        return (T)this;
    }
}

public class CakeEater extends Foo<CakeEater> 
{
    public void f(){}
}

编辑

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

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

标签:parameterized,java,subclass,generics,return-type
来源: https://codeday.me/bug/20190928/1828546.html