9

Javaジェネリックを読んでいて、興味深いクエリに出くわしました。私の質問は次のとおりです。

  1. 上限のあるワイルドカードの場合

    public static void printList(List<? extends Number> list) {
        for (int i = 0; i < 10; i++) {
            list.add(i);// gives compilation error
        }
    }
    
  2. 下限ワイルドカードの場合

    public static void printList(List<? super Integer> list) {
        for (int i = 0; i < 10; i++) {
            list.add(i);// successfully compiles
        }
    }
    

Sun Oracleのドキュメントを見ると、ポイント1でもコードをコンパイルする必要があることがわかっているため、これと混同しています

上限のワイルドカード 下限のワイルドカード

誰でもこれを理解するのを手伝ってもらえますか?

4

2 に答える 2

10

これは、上限を使用している場合、要素をコレクションに追加できず、要素を読み取るだけであるためです。

これは、これらが合法的な割り当ての一部であることを意味します。

List<? extends Number> l = new ArrayList<Integer>();
List<? extends Number> l = new ArrayList<Double>();

そのため、オブジェクトを追加するときに、正しいタイプのオブジェクトが保持されることを保証できません。より良い説明のためにフォローしてください: List< に追加するにはどうすればよいですか? Number> データ構造を拡張しますか?

于 2013-04-24T10:40:20.510 に答える
2

実際、幸いなことに同じシナリオで、Sun Oracle ドキュメントの次のページで答えを得ました。以下のリンクを見つけてください。将来検索する人に役立つかもしれません。

ワイルドカード キャプチャ

于 2013-04-24T10:28:19.810 に答える