在方法中返回一个类的实例

问题描述:

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

例如:

抽象类A声明必须返回的“列表” B类一个实例的方法(方法1)和C延伸A.我想B返回一个ArrayList和C返回一个LinkedList。

我该如何实现?谢谢

+4

这是一个家庭作业的问题吗? – 2012-02-20 16:00:10

+0

没有..只需要它在我的程序中 – Addev 2012-02-20 19:01:16

如果你想让来电知道它得到了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

有一个返回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>(); 
    } 
    }