Javaでのワイルドカードの理解の難しさ

Difficulty Understanding Wildcards in Java


質問 written by Bill the Lizard @2014-03-12 17:51:06Z

: 6 : 1 : 118

Javaジェネリックのワイルドカードを理解するのが困難です。 具体的には、次の質問があります。

  1. LinkedList<?>がある場合、 Objectを追加できないのはなぜですか? リストのタイプがわからないことは理解していますが、どのような状況でもObjectをリストに追加しないとわかりませんか?

  2. 上記の質問と同様に、 LinkedList<? extends Number>がある場合はLinkedList<? extends Number> LinkedList<? extends Number> 、なぜNumberaddできないのですか?

  3. 最後に、 LinkedList<? super Number> LinkedList<? super Number> 、なぜリストにIntegeraddできるのでしょうか。Numberのスーパークラスであるものだけを追加できるのではないでしょうか?

私はワイルドカードがどのように一般的に機能するかを理解しようとしていると思います、私はそれらに関するOracleチュートリアルを読んだことがありますが、なぜ機能するのか理解していません。

コメント 1

List <?>は、リストに何かが含まれている可能性があることを意味しますが、それらはすべて同じタイプです。それらが何であるかわからないので、追加することはできません。

written by 恐竜14年 @2014-03-12 17:52:37Z

コメント 2

何らかの理由で、UNIXシェルワイルドカードについて考えていました。

written by hcaulfield57 14年 @2014-03-13 18:45:48Z

回答 1 written by SLaks @2014-03-12 17:51:39Z
5

オブジェクトとタイプを混同しています。
単純なジェネリックパラメーターとは異なり、ワイルドカードはジェネリックパラメーターのタイプを記述します。
List<? super Number> List<? super Number>は、 Numberのスーパークラスのリストではありません。 それはいくつかの未知のタイプのリストであり、そのタイプは数値のスーパークラスです。

LinkedList<?>LinkedList<Car>ます。
ObjectCarではないため、 Object追加することはできません。

実際、リストに含まれるタイプについて何知らないので、リストに何も追加できません。 nullを除く)

同様に、 LinkedList<? extends Number> LinkedList<? extends Number>List<Long>である可能性があるため、 Integerを追加することはできません。 IntegerLongはないため)

一方、 List<? super Number> List<? super Number>は、 Numberまたはいずれかの派生クラスを含むことが確実に許可されます。これは、 Numberのスーパークラスの1つのリスト(たとえばList<Object> )のみであるためです。

コメント 1

答えてくれてありがとう、それは私にはもっと理にかなっていますが、私はまだあなたがList<? super Number>Numberサブクラスを追加できる理由を理解しようとしていますList<? super Number>List<? super Number>List<? super Number>何かを追加するときList<? super Number>List<? super Number> 、それをObjectとして扱いますか?

written by hcaulfield57 14年 @2014-03-13 19:03:57Z

コメント 2

それは何かとして「扱う」ことはありません。リストが実際どんなNumberのスーパークラスであっても 、それは確かにNumber保持できます。

written by SLaks 14年 @2014-03-13 19:09:23Z

コメント 3

わかりましたが、 List<? super Number> Integeraddた場合List<? super Number>List<? super Number> 、これはNumberスーパークラスではないので、どのように追加できますか、何か不足していますか?

written by hcaulfield57 14年 @2014-03-13 19:24:42Z

コメント 4

あなたはまだオブジェクトと型を混乱させています。あなたはそれがNumberスーパークラスであるあるタイプのListであることを知っています。そのタイプが何であっても、 Integerを保持できます。

written by -SLaks 14年 @2014-03-13 19:51:10Z