108

Java における共分散と反分散の良い例を示してください。

4

3 に答える 3

49

共分散: Iterable と Iterator。Iterableほとんどの場合、共変またはを定義することは理にかなっていますIteratorIterator<? extends T>と同じように使用できますIterator<T>。型パラメーターが表示される唯一の場所はnextメソッドからの戻り値の型であるため、安全に にアップキャストできますT。しかしSextends がある場合は、 type の変数にT代入することもできます。たとえば、find メソッドを定義している場合:Iterator<S>Iterator<? extends T>

boolean find(Iterable<Object> where, Object what)

List<Integer>andで呼び出すことはできない5ため、次のように定義する方が適切です。

boolean find(Iterable<?> where, Object what)

反分散: コンパレータ。Comparator<? super T>と同じように使用できるため、ほとんどの場合、使用する意味がありますComparator<T>compare型パラメーターはメソッド パラメーターの型としてのみ表示されるため、T安全に渡すことができます。たとえば、 a があり、そのコンパレータ (は のサブクラス) でDateComparator implements Comparator<java.util.Date> { ... }a を並べ替えたい場合は、次のように実行できます。List<java.sql.Date>java.sql.Datejava.util.Date

<T> void sort(List<T> what, Comparator<? super T> how)

しかし、一緒ではありません

<T> void sort(List<T> what, Comparator<T> how)
于 2010-03-23T19:29:03.393 に答える
-6

Liskov 置換原理を見てください。実際、クラス B がクラス A を拡張する場合、A が必要なときはいつでも B を使用できるはずです。

于 2010-03-23T15:24:30.017 に答える