あなたの提案された署名はJava-8でおそらく動作します。しかし、以前のJavaバージョンでは、型推論はそれほど賢明ではありませんでした。 List<java.sql.Date>
があるとします。 java.sql.Date
はjava.util.Date
を拡張し、Comparable<java.util.Date>
を実装することに注意してください。コンパイル時
List<java.sql.Date> list = new ArrayList<>();
Collections.sort(list);
これはJava 7で完全に機能します。ここでT
はjava.sql.Date
と推定され、実際にはComparable<java.util.Date>
であり、Comparable<? super java.sql.Date>
であると推定されます。しかしのはあなたの署名を試してみましょう:
public static <T extends Comparable<T>> void sort(List<? extends T> list) {}
List<java.sql.Date> list = new ArrayList<>();
sort(list);
ここT
はjava.util.Date
と推測されるべきです。しかし、Java 7の仕様ではこのような推論ができません。したがって、このコードは、Java 8でコンパイルが、Java-7でコンパイルするとき失敗することができる。
Main.java:14: error: method sort in class Main cannot be applied to given types;
sort(list);
^
required: List<? extends T>
found: List<Date>
reason: inferred type does not conform to declared bound(s)
inferred: Date
bound(s): Comparable<Date>
where T is a type-variable:
T extends Comparable<T> declared in method <T>sort(List<? extends T>)
1 error
型推論を大幅ジャワ-8に向上しました。別のJLS chapter 18がこれに専念していますが、Java-7ではルールがより簡単です。were彼らはタイプT
とT
の定義におけるComparable
への型引数との関係に異なる要件を課しているため
しかし、static> T max(Collection extends T> c)はうまくいきます...これは再び推論の問題ですか? –
prvn
@prvnの場合、提案されている署名のように 'Comparable'の代わりに' Comparable super T> 'があります。 '> void sort(List extends T> list)'も使えますが、 '? extends T'はここでは完全に不要で、 'max'メソッドでは合理的です(' max'は値を返します)。 –
もう一つのポイントがあります。 'List extends T> list'のようなワイルドカード型の場合、メソッド内で' list.set(index、list.get(anotherIndex)) 'を実行することはできません。これは内部ヘルパーメソッドで '? Tを他の型変数に拡張します(あるいは、内部実装がしばしば行うようにチェックされていない操作を使用することによって)が、ワイルドカードを持たない型は、変更されるリストに対してよりクリーンです。 – Holger