openjdk7 のコードの一部を読んで、メソッド Collections.reverse が次のように実装されていることがわかりました (RandomAccess リストの最適化をいくつか削除しました)。
public static void reverse(List<?> list) {
int size = list.size();
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i = 0, mid = list.size() >> 1; i < mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
ListIterators の両方の初期化で、チェックされていない警告が生成されます (コードに @SupressWarnings 注釈はありません)。
私にとって、保存して簡単に実装する方法は次のとおりです。
public static <E> void reverse2(List<E> list) {
int size = list.size();
ListIterator<E> fwd = list.listIterator();
ListIterator<E> rev = list.listIterator(size);
for (int i = 0, mid = list.size() >> 1; i < mid; i++) {
E tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
これは完全に安全です。
私の質問は次のとおりです。
- openjdk が raw 型を使用する安全でないコードを使用するのはなぜですか?
- 警告が抑制されないのはなぜですか?