【问题标题】:Java abstract method and interfaceJava抽象方法和接口
【发布时间】:2012-04-12 10:57:47
【问题描述】:

我有一个接口HTTPSequence。我还有一个抽象类AbstractHTTPFactory,它又有一个抽象方法返回ArrayList<HTTPSequence>。在派生自AbstractHTTPFactory 的类中,我想重写这些方法以返回ArrayList<[Class implementing HTTPSequence]>

有可能吗?现在编译器给了我一个错误,建议我将覆盖的方法签名更改为HTTPSequence

// abstract class with abstract method returning ArrayList of objects implementing interface
abstract public class AbstractHTTPFactory {
    abstract ArrayList<HTTPSequence> make();
}
// Specific class that returns ArrayList of objects of the class implementing HTTPSequence
public class RecipesHTTPFactory extends AbstractHTTPFactory{
    public ArrayList<Recipe> make() {
    }
}
// interface
public interface HTTPSequence {
}
// one of the classes implementing the above interface
public class Recipe implements HTTPSequence {
}

Eclipse 给我的信息是:

此行有多个标记 - 返回类型与 AbstractHTTPFactory.make() 不兼容 - 实现 ....ider.AbstractHTTPFactory.make

【问题讨论】:

  • 你为什么只想返回一个非泛型的ArrayList?这违背了泛型的目的!
  • 一些示例代码会很有帮助。
  • 以及准确的编译器消息。挥手无济于事,@user971155

标签: java generics


【解决方案1】:

您可以编写您的 AbstractClass 方法以返回 ArrayList&lt;? extends Interface&gt;,然后您不必更改派生类方法签名

【讨论】:

  • 似乎正是我所需要的。谢谢
  • 有时间限制,除了现在还可以
【解决方案2】:

以下设计可让您避免返回通配符泛型类型,即limited use to the caller

abstract public class AbstractHTTPFactory<T extends HTTPSequence> {
    abstract ArrayList<T> make();
}

public class RecipesHTTPFactory extends AbstractHTTPFactory<Recipe> {
    public ArrayList<Recipe> make() { ... }
}

现在您可以致电new RecipesHTTPFactory().make() 并返回ArrayList&lt;Recipe&gt; 而不是ArrayList&lt;? extends HTTPSequence&gt;

还请注意,除非调用者特别期望 ArrayList,否则 it is bettermake() 将返回 List&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2013-01-19
    相关资源
    最近更新 更多