2012-02-20 11 views
0

メソッドを宣言して特定のクラスのインスタンスを返す方法を知りたいのですが。例えばメソッド内のクラスのインスタンスを返す

抽象クラスAがクラスB及びCは、I Bが返すためのArrayList及びCを返したいA.を拡張 「リスト」のインスタンスを返さなければならない方法(法1)を宣言するLinkedList。

どうすれば実装できますか?あなたはへ発信してそれがLinkedListArrayListあなたが活用できるジェネリックを取得していますを知りたい場合はおかげ

+4

これは宿題の質問ですか? –

+0

いいえ..私のプログラムでそれが必要でした – Addev

答えて

6

それはこのようなものになります:あなたは、あなたが共変戻り値の型を活用することができますし、単にサブクラスが宣言している(いないA経由で)直接BCと対話しようとしている場合

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() { 
     //... 
    } 
} 

か、を戻りタイプはそれぞれArrayListLinkedListです。 Java 5以降では、オーバーライドされたメソッドの戻り値の型を絞り込むことは正当です。

具体的なタイプを呼び出し側に知らせる必要がない場合は、リストを作成する戦略(つまりファクトリ)をAに渡すだけです。これは、単純なインターフェイスを実装することによって行うことができます。Aのコンストラクタに渡すと、簡単なインターフェイスを実装することができます。A。実際には、どちらの方法でも工場を使うことができますが、私が最初に説明した場合は、クラスBCだけが必要です。

1

Have Aタイプのインタフェースを返します。(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html)LinkedListとArrayListの両方でこのインタフェースが実装されています。 BとCは必要な型を返すことができます。

1

このように簡単:

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>(); 
    } 
} 
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 
    } 
} 

サブクラスがオーバーライドすること/スーパークラス(戻り値の型、パラメータとスローされた例外)でオーバーライド/実装方法よりも狭いタイプ(複数可)を使用して実装することですリスト内の要素のタイプを指定します。

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>();} 
} 
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>(); 
    } 
    } 
関連する問題