Java 无法在抽象方法的实现中返回抽象类的子类

Java 无法在抽象方法的实现中返回抽象类的子类,java,inheritance,abstract-class,abstract,Java,Inheritance,Abstract Class,Abstract,我有一个抽象类的两个子类,每个子类实现其超类的一个抽象方法。我希望每种类型都有不同的返回类型,尽管这些返回类型依次是不同抽象类的子类。见下文: public abstract class Gardener { public abstract ArrayList<Flower> getFlowers(); } public class GardererA extends Gardener { public ArrayList<Flower> getFl

我有一个抽象类的两个子类,每个子类实现其超类的一个抽象方法。我希望每种类型都有不同的返回类型,尽管这些返回类型依次是不同抽象类的子类。见下文:

public abstract class Gardener {

    public abstract ArrayList<Flower> getFlowers();
}

public class GardererA extends Gardener {

    public ArrayList<Flower> getFlowers() {
        return new ArrayList<Daisy>();
    }
}

public class GardererB extends Gardener {

    public ArrayList<Flower> getFlowers() {
        return new ArrayList<Rose>();
    }
}

public abstract class Flower {}

public class Daisy extends Flower {}

public class Rose extends Flower {}
公共抽象类园丁{
公共抽象数组列表getFlowers();
}
公共级GardererA扩展了Gardener{
公共阵列列表getFlowers(){
返回新的ArrayList();
}
}
公共类GardererB扩展了Gardener{
公共阵列列表getFlowers(){
返回新的ArrayList();
}
}
公共抽象类Flower{}
公共类Daisy扩展花{}
公共级玫瑰花{}

显然Java不允许我这样做,但我不知道如何获得这个功能。有什么想法吗?

您可以像这样使用泛型:

public abstract class Gardener<T extends Flower> {

    public abstract ArrayList<T> getFlowers();
}

public class GardererA extends Gardener<Daisy> {

    public ArrayList<Daisy> getFlowers() {
        return new ArrayList<Daisy>();
    }
}

public class GardererB extends Gardener<Rose> {

    public ArrayList<Rose> getFlowers() {
        return new ArrayList<Rose>();
    }
}

public abstract class Flower {}

public class Daisy extends Flower {}

public class Rose extends Flower {}
公共抽象类园丁{
公共抽象数组列表getFlowers();
}
公共级GardererA扩展了Gardener{
公共阵列列表getFlowers(){
返回新的ArrayList();
}
}
公共类GardererB扩展了Gardener{
公共阵列列表getFlowers(){
返回新的ArrayList();
}
}
公共抽象类Flower{}
公共类Daisy扩展花{}
公共级玫瑰花{}
使用通配符:

public abstract class Gardener {

    public abstract ArrayList<? extends Flower> getFlowers();

}
公共抽象类园丁{

公共抽象数组列表为什么要放置
()
在类名中?它们不是构造函数方法。我看到很多类而不是很多接口。我想看看需要了解不同Gardener a和B的客户端代码。我认为泛型可能会帮助您,但我们需要了解更多细节。@aastefanov感谢您指出这一点。我编辑了我的问题来解决这个问题。@emeraldjava我提供的代码只是这个问题的一个例子,真正的代码正确地使用了抽象类这是一个很好的答案!