1

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 型を使用する安全でないコードを使用するのはなぜですか?
  • 警告が抑制されないのはなぜですか?
4

3 に答える 3

0

FWIW Generics Faq でこれが回答されていることがわかりました。

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ302A

于 2013-10-24T10:18:06.500 に答える
0

これはトレードオフです。JDK 開発者は、他の開発者への警告を減らすために、自分たちの側で警告を受け入れます。を使用して、つまり生の型として古いコードをコンパイルしている場合は、安全であるため、警告なしListで に渡すことができます。Collections.reverse()しかし、生のCollections.reverse()typepublic static <E> void reverse(List<E> list)でそれを呼び出そうとすると、警告を受け取りましたList

于 2013-10-24T08:17:34.810 に答える