在方法中返回一个类的实例
我想知道如何声明一个方法将返回一个特定类的实例。在方法中返回一个类的实例
例如:
抽象类A声明必须返回的“列表” B类一个实例的方法(方法1)和C延伸A.我想B返回一个ArrayList和C返回一个LinkedList。
我该如何实现?谢谢
如果你想让来电知道它得到了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
。
有一个返回Collection类型的接口(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html)的LinkedList和ArrayList都实现了这个接口,使B和C可以返回所需的类型。
一样简单的:
abstract class A {
abstract List<Integer> method1();
}
class B extends A {
@Override
public LinkedList<Integer> method1() {
return new LinkedList<Integer>();
}
}
当然不会使马克彼得解决错误的这一点,它只是一个开始关闭恕我直言,更简单的方法。
如果您想使用与您选择的类型参数列表中,你总是可以写:
abstract class A<T> {
abstract List<T> method1();
}
class B<T> extends A<T> {
@Override
public LinkedList<T> method1() {
return new LinkedList<T>();
}
}
这是相当简单的。关键是,一个子类可以重写/使用比重写/实现方法窄类型的超类(返回类型,参数,抛出的异常)
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
}
}
在这里,我输入的类实现与列表中的元素类型相关联。
这实际上被称为工厂方法模式。
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>();}
}
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>();
}
}
这是一个家庭作业的问题吗? – 2012-02-20 16:00:10
没有..只需要它在我的程序中 – Addev 2012-02-20 19:01:16