返回方法中的类的实例

时间:2012-02-20 15:58:04

标签: java inheritance

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

例如:

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

我该如何实现?感谢

6 个答案:

答案 0 :(得分:6)

如果您希望来电者知道它正在获得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),那么您可以利用协变返回类型并简单地让子类声明返回类型分别为ArrayListLinkedList。在Java 5+中,缩小被覆盖方法的返回类型是合法的。

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

public interface ListFactory<T> {

    public List<T> newList();
}

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

答案 1 :(得分:1)

返回类型为Collection的接口(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html)LinkedList和ArrayList都实现此接口以便B和C可以返回所需的类型。

答案 2 :(得分:1)

这很简单:

abstract class A {
    abstract List<Integer> method1();
}

class B extends A {
    @Override
    public LinkedList<Integer> method1() {
        return new LinkedList<Integer>();
    }
}

这当然不会使马克彼得的解决方案出错,这只是开始使用imho的一种更简单的方式。

如果要将列表与您选择的类型参数一起使用,您可以随时写:

abstract class A<T> {
    abstract List<T> method1();
}

class B<T> extends A<T> {
    @Override
    public LinkedList<T> method1() {
        return new LinkedList<T>();
    }
}

答案 3 :(得分:1)

这很简单。关键是子类可以使用更窄的类型覆盖/实现,而不是超类中的重写/实现方法(返回类型,参数和抛出的异常)

public abstract class A<T> {
    public List<T> getList();
}

public class B<T> extends A<T> {
    public ArrayList<T> getList() {
        // some impl
    }
}

public class C<T> extends A<T> {
    public LinkedList<T> getList() {
        // some impl
    }
}

这里我输入了列表中包含元素类型的类。

答案 4 :(得分:1)

这实际上称为工厂方法模式。

abstract class A{
    abstract public List<A> getList();
}

class B extends A{
    public List<A> getList(){return new ArrayList<A>();}
}

class C extends A{
    public List<A> getList(){return new LinkedList<A>();}
}

答案 5 :(得分:1)

  public abstract class A<T> {
    public abstract List<T> getList();
  }

  public class ArrayListB extends A<String> {
    public List<String> getList(){
      return new ArrayList<String>();
    }
  }

  public class LinkedListC extends A<String> {
    public List<String> getList(){
      return new LinkedList<String>();
    }
  }