2012-05-09 6 views
2

私は地図やコレクションを拡張する必要があり、一般的なパラメータを、定義したいが、私はどのように行うのか分からない:MapまたはCollectionを拡張する汎用パラメータを定義する方法は?

public <T> void test(T t) {} 

私のようにそれを書くことができます。

public <T extends Map> void test(T t) {} 

または

public <T extends Collection> void test(T t) {} 

しかし、私には、Tをマップまたはコレクションを1つの方法で拡張させることは可能かどうかはわかりません。

+6

'Map'か' Colleciton'かどうかわからない場合は、 't'をどのように使いますか? – aioobe

+1

可能な複製(http://stackoverflow.com/questions/745756/java-generics-wildcarding-with-multiple-classes)と、それはあなたの実装をより汚く –

答えて

5

短い回答:いいえ。

メソッド内でtパラメータを使用する予定はありますか? MapCollectionは共通のスーパータイプとしてObjectしか持たないので、tで呼び出すことができる方法はObjectのものになります。 (両方のインターフェイス上でもメソッドは、このようsize()として、コンパイラによって拒否されます。)を念頭に置いて

、あなたができる何らかの理由があるない、このときの手法オーバーロード?それは、所望の各パラメータのタイプごとに1つの実装を定義し、次のとおりです。あなたが何らかの理由でそれを行うにはしたくない場合は

public void test(Map<?,?> t) { ... } 
public void test(Collection<?> t) { ... } 

、あなたが均等にだけObjectを取るためのメソッドを宣言し、実行を行うことができると思わクラスの時型チェック。とにかくMapまたはCollection固有のメソッドを呼び出すためにキャストする必要があるため、これは意味的には同等ですが、型チェックは実行時ではなくコンパイル時に行われることを意味します。 Javaの型システムでは、この型の依存関係を表現することはできません。そのため、他には何も表示されません。その後、

3

ありませんが、それは可能ではないですが、あなたは、2つの個別のメソッドを作成することができます:あなたは取り扱い方法でそれらをミックスしたいあなたも、このようにそれを書くことができた場合は

public <T extends Map> void test(T t) { 
    // do the map part 
} 

public <T extends Collection> void test(T t) { 
    // do the collection part 
} 

を:

private void mixedTest(Object t) { 
    if (t instanceof Map) { 
    // map part 
    } else if (t instanceof Collection) { 
    // collection part 
    } else { 
    throw new RuntimeException("Unknown object"); 
    } 
} 

電話:

public <T extends Map> void test(T t) { 
    mixedTest(t); 
} 

public <T extends Collection> void test(T t) { 
    mixedTest(t); 
} 

しかし、とにかく素晴らしいコードにつながるかどうかはわかりません。異なるタイプのオブジェクトのための異なる実装で最初の部分に固執します。

3

public <T extends Map> void test(Map t) {} 

public <T extends Collection> void test(Collection t) {} 

についてどのような...とJavaが使用する正しいものを選択しましょうか?

関連する問題