質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1590閲覧

ジェネリックスを使用したコレクションについて

IM18

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/01 06:03

編集2016/07/01 06:37

###発生している問題・エラーメッセージ

Javaの勉強をしています。
ワイルドカードを使用したジェネリックスの指定について、
以下のコードでコンパイルエラーになる理由について知りたいです。

Javaのどのような構文ルールから、コンパイルエラーになるのでしょう?

なお質問者は、ワイルドカードを使用したジェネリックス周りについて、
以下のような前提の認識でおります。

  • List<? extends BBB4_4>

listにはBBB4_4と、BBB4_4のサブクラスのインスタンスが設定できる。

  • List<? super BBB4_4>

listにはBBB4_4と、BBB4_4のスーパークラスのインスタンスが設定できる。

###該当のソースコード

Java

1package Chapter4; 2 3import java.util.List; 4 5class AAA4_4{} 6class BBB4_4 extends AAA4_4{} 7 8public class No4_4 { 9 public void addData(List<? extends BBB4_4> list){ 10 list.add(new BBB4_4()); // コンパイルエラー 11 // ちなみに「List<? super BBB4_4>」の場合は上の記述でもエラーにならない 12 } 13}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ワイルドカードを使ったコレクションにaddなどは出来ない仕様です。
? extends BBB4_4のような形の場合、BBB4_4のサブクラスの型を扱っていることはわかるのですが、実際何の型を扱っているかの情報がわかりません。
仮にBBB4_4を継承したCクラスがあったとします。List<? extends BBB4_4>はBBB4_4のListかもしれませんし、CのListかもしれません。
もし実体がCのListだとしたら、BBB4_4のインスタンスは入れられません。そのため、この形は型安全が保たれないため、エラーとなるのです。
superの場合、BBB4_4のスーパークラス型にBBB4_4のインスタンスを入れるのは問題ないため、OKなのです。

投稿2016/07/01 06:50

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IM18

2016/07/01 07:10

丁寧な回答ありがとうございました! 理解できました。
guest

0

まず、<? extends SomeClass><? super SomeClass>の解釈が逆です。

そして、型安全上、List<? extends SomeClass>にはnull以外のものをaddできません。

というのも、List<? extends SomeClass>には、List<SomeClass>だけでなく、List<SomeClassのサブクラス>も指定できるので、そこにSomeClassのインスタンスを代入してしまえば、型が一致しなくなってしまいます。

投稿2016/07/01 06:35

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IM18

2016/07/01 06:56 編集

回答ありがとうございます!拝読いたしました。 少しわかってきたのですが、追加で一点質問させて下さい。 >まず、<? extends SomeClass>と<? super SomeClass>の解釈が逆です。 大変失礼しました!誤記でしたので、修正しました。 >というのも、List<? extends SomeClass>には、List<SomeClass>だけでなく、List<SomeClassのサブクラス>も指定できるので、そこにSomeClassのインスタンスを代入してしまえば、型が一致しなくなってしまいます。 それでは、<? super SomeClass>の以下のコードの場合は、なぜコンパイルエラーにならないのでしょうか。というのも、「すべての型が一致していない」という点では、<? extends SomeClass>と同じだと思うからです。 public void addData(List<? super BBB4_4> list){ list.add(new BBB4_4()); // コンパイルエラーにならない }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問