Java における共分散と反分散の良い例を示してください。
3 に答える
共分散: Iterable と Iterator。Iterable
ほとんどの場合、共変またはを定義することは理にかなっていますIterator
。Iterator<? extends T>
と同じように使用できますIterator<T>
。型パラメーターが表示される唯一の場所はnext
メソッドからの戻り値の型であるため、安全に にアップキャストできますT
。しかしS
extends がある場合は、 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.Date
java.util.Date
<T> void sort(List<T> what, Comparator<? super T> how)
しかし、一緒ではありません
<T> void sort(List<T> what, Comparator<T> how)
Liskov 置換原理を見てください。実際、クラス B がクラス A を拡張する場合、A が必要なときはいつでも B を使用できるはずです。