2010-12-07 5 views
1

Java:ジェネリックの異なるインターフェース

私は同じメソッド(foo)を持つ2つのクラス(AとB)を持っています:

public class A { 
public String foo() { 
    return "A said foo"; 
} 
} 

public class B { 
public String foo() { 
    return "B said foo"; 
} 
} 

このメソッドを呼び出せるジェネリッククラスを作りたいと思います。しかし、私は実行時にこれを行う方法が2つあり、コンパイル時間に関する考え方はありません。

  1. 型をチェックしてAまたはBにキャストします。

  2. メソッドを取得します。

getMethodを呼び出すジェネリックの例:

public class Template<T> { 
private T mT; 

public Template(T t) { 
    mT = t; 
} 

    public String bar() { 
    String result = "no result"; 
    try { 
     Method m = mT.getClass().getMethod("foo", null); 
    result = (String)m.invoke(mT); 
    } catch (Exception e) { 
    result = e.toString(); 
    e.printStackTrace(); 
    } 
    return result; 
    } 
} 

別の方法がありますか? 私はこのようなものを探しています:

public class Template<T extends A | B> { 
... 
} 

私はクラス "A"と "B"の作成者ではないことに注意してください。

答えて

5

両方のクラスにfooメソッドを宣言する共通のインターフェイスを実装させる必要があります。 Javaはいわゆるダックタイピングをサポートしていません。

+0

実際。インタフェース(またはスーパークラス)がなければ、これを行うための*唯一の方法は、反射、ジェネリック、またはノーを経由します。 –

0

おそらく、クラスABAbstractをAとBの親タイプとして作ることができます。 このクラスを引数として使用するか、ワイルドカードジェネリックスでそのままABAbstractにキャストします。 また、クラスAとクラスBの両方にメソッドfooを宣言するインタフェースを実装させることもできます。これはおそらく、あなたのコンパイルがエラーを投げないようにする最も簡単な方法であり、あなたが「あなたが探していた」と言ったものとまったく同じです。

しかし、私シンキーOUには書くことがあります。

public class Template<T extends ABInterface> { 

をしかし、私は間違いなくこのことについて確認していません。 クラスがインプリメンテーションキーワードを使用するのに必要なインプリメントにすることもできます。

4

インターフェイスを作成し、そのインターフェイスを実装するクラスをテンプレートで受け入れる必要があります。

interface Foo{ 
    public String foo(); 
} 

public class A implements Foo { 
    public String foo() { 
     return "A said foo"; 
    } 
} 

public class B implements Foo{ 
    public String foo() { 
     return "B said foo"; 
    } 
} 

public class Template<T extends Foo> { 
    private T mT; 

    public Template(T t) { 
     mT = t; 
    } 
    public String bar() { 
     return mT.foo(); 
    } 
} 
+0

私はAクラスとBクラスの作成者ではありません。 – Vlad

関連する問題