2016-05-30 6 views
0

Listはジェネリックで定義されています。このリストのすべての要素は、インタフェースTransferableDataを定義します。最終的にリストを作成するオブジェクトに応じて、データで何かを行うメソッドを呼び出す必要があります。ジェネリックリストエレメントのタイプに基づいたメソッドの呼び出し

private <T extends TransferableData> String doSomething(List<T> data, Class<T> dataType){ 
    if(returnType.equals(A.class)){ 
     for(T singleElement : data){ 
      ((A)singleElement).methodInsideA(); 
     } 
    }else if(returnType.equals(B.class)){ 
     for(T singleElement : data){ 
      ((B)singleElement).methodInsideB(); 
     } 
    } 
} 

私は、これはこれを行う方法はありませんことを実現:

は、だから私はこのような何かをアーカイブします。私はちょうどすべてのif-elseとチェックされていないキャスティングがなければ、適切な方法を見つけることができません。

+0

必要なものは、異なるデザインアプローチである - Strategyパターンの方向に少し見えます。 – Stefan

+3

'TransferableData'でそのメソッドを宣言し、各リスト要素のメソッド内で非条件付きで呼び出すだけで、具体的なクラスで望みどおりに実装するのはなぜですか? – Mena

+1

'returnType'を書いたところで' dataType'を書いたのですか? – erickson

答えて

0

をインターフェイスでは、戻り値の型としてvoidを持つメソッドinvokeMethod()を追加できます。以下のソリューションが機能するには、すべてのクラスで同じメソッドシグネチャを使用する必要があります。

public interface TransferableData { 
    void invokeMethod(); 
} 


public class A implements TransferableData { 

    @Override 
    public void invokeMethod() { 
     //Your business logic A 
    } 
} 

public class B implements TransferableData { 

    @Override 
    public void invokeMethod() { 
     //Your business logic for B 
    } 
} 

(このメソッドにデータ型を渡すする必要はありません)などのオブジェクトのリストを反復処理:

private <T extends TransferableData> String doSomething(List<T> data) { 

    for(T object: data){ 
     object.invokeMethod(); 
    } 
    //return the string according to your business logic. 
} 
0

あなたはこのような何かを試すことができメナからのコメントを1として、

public interface TransferableData { 

    void genericInvoker(); 
} 


public class A implements TransferableData { 

    @Override 
    public void genericInvoker() { 
     methodInsideA(); 
    } 

    void methodInsideA(){ 
     // Do specific thing to A 
    } 
} 

public class B implements TransferableData { 

    @Override 
    public void genericInvoker() { 
     methodInsideB(); 
    } 

    void methodInsideB(){ 
     // Do specific thing to B 
    } 
} 

次のように次にあなたがメソッドを呼び出すことができます:あなたのクラスはTransferableDataを実装しているという仮定に基づいて

private <T extends TransferableData> String doSomething(List<T> data, Class<T> dataType){ 

    for(T singleElement : data){ 
     singleElement.genericInvoker(); 
    } 

    //Don't forget to return a String from this method 
} 
関連する問題