Java Gold SE8の問題を解いているのですが、下記について混乱しています。
どなたか、「簡単に考えてここはこうなんだよ」とお分かりになる方がいらっしゃいましたら教えて下さい。
Java Gold SE8問題集(俗に言う黒本)の総仕上げ問題で次のような問題が出ています。
P406 問71
ジェネリック・クラスの宣言として正しいものを選びなさい。(1つ選択)
A.public class Test<? extends Integer> {}
B.public class Test<T implements Comparator> {}
C.public class Test<T, U extends T> {}
D.public class Test<T super String> {}
解答と説明は次の通りです。
P450 答え71 C
ジェネリック・タイプの宣言の型パラメータにおける型変数にワイルドカード「?」を使用することはできません。したがって、選択肢Aは誤りです。また、型変数の上限境界の設定にはインターフェースを指定する場合でもextendsキーワードを使用する必要があるため、選択肢Bも誤りです。選択肢Cは、TとUの2つの型変数が宣言されており、そのうちUの上限境界をTに設定している正しいジェネリック・タイプの宣言です。したがって、選択肢Cは正解です。型変数の上限境界に使用できるのはextendsキーワードであるため、選択肢Dも誤りです。
〜引用ここまで〜
Bがimplementsできないのは分かるのですが、AとDは(個人的感覚として)結構頻繁に見る型だったので、なぜAとDがダメなのかと言うのが整理できないでいます。
Aがダメなの理由としては、そのクラスの内部の記述をする際、特定の型Tが宣言されているならばTでコーディングできるので良いのだが、ワイルドカードの?で宣言されても、?はクラス内部のコーディングで使用できないから、と言うように理解しました。
それでは今まで見てきたList<? extends T>などの記述はどこで使うのか?
また、List<? super T>なども見てきましたが、public class Test<T super String> はなぜいけないのか。
恐らくはジェネリクスに対する理解が中途半端なまま問題集や参考書を読んできてしまったので、上記に整合性が取れないままでいるかと思うのです。
ワイルドカードや下限境界・上限境界などの理解として、「この型を指定した場合は、指定型の継承クラスが扱える」/「この型を指定した場合は、指定型のスーパークラスが扱える」と言う理解まではしているのですが、その「ワイルドカードや下限境界・上限境界」がどこで使用できてどこで使用できないのか、と言う理解が定まりません。
漠然とした内容となってしまい恐縮ですが、どなたかお分かりに為る方がいらっしゃいましたらご教授頂けないでしょうか。
No.1
- 回答日時:
ジェネリッククラスの「宣言」と「使用」を区別すればよいのでは.
回答ありがとうございます。
細かく具体的に書けば、
1.Classそのものの中身のコーディング時の型指定→使用不可
2.static void doIt(A<? super Y> arg) {}などでのメソッド引数の型指定時→使用可
3.List<? super Integer> = 〜などオブジェクトでの型指定時→使用可
と言う感じでしょうか。
No.2ベストアンサー
- 回答日時:
例えば変数を宣言する時、「型の実引数」として
List<? extends Number> numlist = ・・・・
とすることは OK。
#用語があっているか不明(^^;
こいつには List<Integer>型のリストと代入互換性がある。
List<Number> numlist = ・・・・
では代入できない。
回答ありがとうございます。
No.1で頂いた回答への御礼と併せますと、
Classそのものの中身のコーディングでは使用不可、それ以外では使用できる、と言うところに落ち着きそうですね・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- 法学 不正アクセス禁止法の扱いについて 4 2022/03/23 18:13
- Java java final 1 2022/06/10 22:49
- 就職 ウエディングプランナーって、エリア限定で働けないとこ多すぎません? 大卒で新卒入社を考えていますが、 3 2023/08/24 00:57
- 防犯カメラ・監視カメラ・小型カメラ Windowsのカメラ機能。設定した通りのfpsでの撮影ができず、コマ落ち動画になる。修正するには? 2 2023/01/29 09:50
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- 数学 数的推理の問題です。 この問題の解説に 「選択肢にルートが付く数字はありませんので、CD,ACのいず 2 2022/04/04 11:09
- Visual Basic(VBA) VBAで早押しゲームを作りたい 4 2022/05/12 13:46
- 宅地建物取引主任者(宅建) 宅建で同じ問題を繰り返し解いていると問題と正解肢を覚えてしまいますが、それでも続けたら・・・ 2 2022/10/06 20:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
java-別クラスの変数の使い方を...
-
Java リフレクションについて
-
C++でfriendクラスにしているの...
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
リフレクション
-
SwingでgetContentPaneのエラー...
-
リレーションエンティティクラ...
-
C++ クラス名の前のdefine
-
Java
-
関数内の変数に<summary>コメン...
-
スーパークラスのコンストラク...
-
C#のクラスライブラリでメッセ...
-
整数値を任意のオブジェクトを...
-
親クラスから子クラスへアクセス。
-
違うクラスからの変数の共有化
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報