【问题标题】:Cannot return subclasses of abstract class in implementations of an abstract method无法在抽象方法的实现中返回抽象类的子类
【发布时间】:2016-12-28 08:44:00
【问题描述】:

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

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 {}

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

【问题讨论】:

  • 为什么要在类名中添加()?它们不是构造方法。
  • 我看到了很多类而不是很多接口。我想看看需要了解不同 Gardener A 和 B 的客户端代码。我认为泛型可能会对您有所帮助,但我们需要了解更多细节。
  • @aastefanov 感谢您指出这一点。我编辑了我的问题来解决这个问题。
  • @emeraldjava 我提供的代码只是问题的一个例子,真正的代码正确使用了抽象类

标签: java inheritance abstract-class abstract


【解决方案1】:

使用通配符:

public abstract class Gardener {

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

}

【讨论】:

  • 这是一个很好的答案!
【解决方案2】:

你可以像这样使用泛型:

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 {}

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多