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にMapまたはCollectionを単一のメソッドで拡張させることが可能かどうかはわかりません。

4

3 に答える 3

5

簡単な答え:いいえ。

tメソッド内のパラメーターで何をするつもりですか?Mapとは共通のスーパータイプとしてCollectionのみ存在するため、呼び出すことができるメソッドは上のメソッドのみです。(など、両方のインターフェイスのメソッドでさえ、コンパイラによって拒否されます。)ObjecttObjectsize()

それを念頭に置いて、この場合にメソッドをオーバーロードできない理由はありますか?つまり、必要なパラメータタイプごとに1つの実装を定義します。

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

なんらかの理由でそれを実行したくない場合Objectは、クラスの実行時型チェックを実行するメソッドを同様に宣言できるようです。Mapとにかく呼び出しまたは特定のメソッドにキャストする必要があるため、これは意味的に同等ですCollectionが、型チェックは実行時ではなくコンパイル時に行われることを意味します。ただし、Javaの型システムでは、この共用体型の依存関係を表現できないため、他の選択肢はありません。

于 2012-05-09T08:45:38.140 に答える
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);
}

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

于 2012-05-09T08:44:44.253 に答える
3

どうですか

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

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

...そして、Javaに使用する正しいものを選択させますか?

于 2012-05-09T08:45:39.497 に答える