我想知道如何声明方法将返回特定类的实例。
例如:
抽象类A声明一个必须返回“List”实例的方法(method1) B和C类扩展A.我希望B返回一个ArrayList而C返回一个LinkedList。
我该如何实现?感谢
答案 0 :(得分:6)
如果您希望来电者知道它正在获得LinkedList
或ArrayList
,那么您可以利用泛型。
它看起来像这样:
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() {
//...
}
}
或者,如果您要直接与B
和C
进行交互(而不是通过A
),那么您可以利用协变返回类型并简单地让子类声明返回类型分别为ArrayList
和LinkedList
。在Java 5+中,缩小被覆盖方法的返回类型是合法的。
如果调用者不需要知道具体类型,那么您只想将策略(即工厂)传递给A
创建列表。这可以通过实现一个简单的界面来完成:
public interface ListFactory<T> {
public List<T> newList();
}
然后将其传递给A
的构造函数。事实上,工厂可以使用任何一种方式,但是如果你处于我描述的第一种情况,你只需要课程B
和C
。
答案 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>();
}
}