java - 在方法中返回类的实例

标签 java inheritance

我想知道如何声明一个方法将返回特定类的实例。

例如:

抽象类 A 声明了一个必须返回“List”实例的方法(method1) 类 B 和 C 扩展了 A。我希望 B 返回一个 ArrayList,而 C 返回一个 LinkedList。

我该如何实现呢?谢谢

最佳答案

如果您希望调用者知道它正在获取LinkedListArrayList,那么您可以利用泛型。

它看起来像这样:

public abstract class A<T extends List<String>> {
    public abstract T method()
}

public class B extends A<ArrayList<String>> {
    public ArrayList<String> method() {
        //...
    }
}

public class C extends A<LinkedList<String>> {
    public LinkedList<String> method() {
        //...
    }
}

或者,如果您要直接与 BC 交互(而不是通过 A),那么您可以利用协变返回类型只需让子类分别将返回类型声明为 ArrayList 和 LinkedList 即可。在 Java 5+ 中缩小重写方法的返回类型是合法的。

如果调用者不需要知 Prop 体类型,那么您只需将创建列表的策略(即工厂)传递给A。这可以通过实现一个简单的接口(interface)来完成:

public interface ListFactory<T> {

    public List<T> newList();
}

然后将其传递给A的构造函数。事实上,工厂可以用任何一种方式使用,但是如果您处于我描述的第一种情况,则只需要类 BC

关于java - 在方法中返回类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364140/

相关文章:

java - Quarkus Panache Hibernate : How to clear the cache, 使实体世界与数据库状态匹配?

c# - Xamarin 表单 XAML : How can I inherit properties from another XAML file like ResourceDictionaries?

java - 为什么是 ClassCastException 而不是编译错误?

java - 将公式放入 for 循环中

java - 找不到类 : org. glassfish.jersey.servlet.ServletContainer

java - BorderLayout 中的 GridBagLayout 问题 : no display in BorderLayout. CENTER

java - BufferedInputStream.available() 在套接字编程中可靠吗?

ios - 如何在子类中设置只读属性?

java - Java 接口(interface)中的抽象方法

C# 在声明抽象方法的类中调用抽象方法是不好的做法吗?