1. ホーム
  2. java

ジェネリック<? スーパーT>の実例は?

2023-10-16 20:44:51

質問

私は、以下のことを理解しています。 <? super T> の任意のスーパークラスを表します。 T (の親クラス)。 T の親クラス)。しかし、この一般的なバインド ワイルドカードの実際の例を想像するのは本当に大変です。

私は何を理解しているかというと <? super T> の意味を理解し、この方法を見たことがあります。

public class Collections {
  public static <T> void copy(List<? super T> dest, List<? extends T> src) {
      for (int i = 0; i < src.size(); i++)
        dest.set(i, src.get(i));
  }
}

の例を探しています。 実際の使用例 この構造が使用できる例を探しているのであって、それが何であるかの説明を求めているのではありません。

どのように解決するのですか?

一番簡単な例として、思いつくのは

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

から引用したもので、同じ Collections . このように Dog を実装することができます。 Comparable<Animal> で、もし Animal はすでにそれを実装しています。 Dog は何もする必要がありません。

EDITで実例を。

メールでのやりとりの後、私の職場の実例を紹介することが許されました(やったー!)。

というインターフェースを持っています。 Sink (それが何をするかは重要ではありません)、そのアイデアは が蓄積される というものです。宣言はかなり些細なものです(簡略化されています)。

interface Sink<T> {
    void accumulate(T t);
}

当然ながら、このメソッドには List を受け取り、その要素を Sink (に変換します(もう少し複雑ですが、簡単に説明します)。

public static <T> void drainToSink(List<T> collection, Sink<T> sink) {
    collection.forEach(sink::accumulate);
}

これは簡単でしょう?まあ...

を持つことができますね。 List<String> を持つことができますが、それを Sink<Object> - というのは、私たちにとってかなり一般的なことです。しかし、これでは失敗します。

Sink<Object> sink = null;
List<String> strings = List.of("abc");
drainToSink(strings, sink);

これを動作させるためには、宣言を次のように変更する必要があります。

public static <T> void drainToSink(List<T> collection, Sink<? super T> sink) {
    ....
}