私はJava GenericsとCollectionsという本をMaurice Naftalin、Philip Wadlerによって読んでいました。最初の2つの章では、私の頭が疑問にぶち壊されてしまいました。私は答えを理解することができませんでした。タイプパラメータのデータ型は共分散および反分散でどのように決定されますか?
機能 'コピー' の呼び出し中にpublic static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
}
List<Object> objs = Arrays.<Object>asList(2, 3.14, "four");
List<Integer> ints = Arrays.asList(5, 6);
Collections.copy(objs, ints);
assert objs.toString().equals("[5, 6, four]");
:
第一パラメータ:?=オブジェクト
第二パラメータ:?
=整数
しかし、データ型は何ですかTの?消去の実装に基づいてjvmによってどのように決定されますか?
その本の中で言われている:行で Collections.copy(OBJ、int型)、型パラメータTが数であると解釈されます。 OBJSがリストに< ?スーパー番号>(スーパーによって要求されるように、オブジェクトは、番号のスーパータイプであるため)と int値がリストに<整数型を持つリストのサブタイプである<オブジェクト>を、型を持つので、呼が許可されています>(リストのサブタイプである)< ?は、>を継承します(Integerは、extendsワイルドカードで必要とされるように、Numberのサブタイプです)。
しかし、整数の両方のシリアライズとComparableを実装して、Numberクラスとオブジェクトクラスを拡張するからアプルも直列化と同等のスーパータイプです。
なぜ、Tは、Numberの代わりにSerializableまたはComparableと見なされますか?なぜなら、Substitution Principleはそれをとることができるからです。
ありがとうございます。
なぜTである正確に何も問題ないです 最も具体的なタイプを選ぶことができますか?ジェネリックはコンパイル時の型チェックにしか使われないので、コンパイラは*働くT *があることに気を付けるべきです。戻り値の型をvoidからTに変更すると、それ以上の違いはありません。 – newacct