
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.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ランキング
-
インスタンス化の条件分けについて
-
クラスのロードが出来ない
-
VC++でクラス変数の定義方法。
-
デッドロックに関して1
-
GPSで取得した値を別のクラ...
-
下記のコードを実行すると、Mai...
-
JBuilderの使い方
-
ヘッダファイルのインクルード...
-
内部クラスから別の内部クラス...
-
Android static finalクラス
-
回答が分かりません。どなたか...
-
Staticイニシャライズについて質問
-
Javaコンストラクタthisとsuper...
-
int型で「005」
-
別ファイルのclassの読み込みに...
-
フォームBeanのメソッド内で変...
-
JavaのGUIプログラミング
-
【初心者】javaコンパイルエラ...
-
C#にて別クラスの関数を使いたい
-
継承について質問させていただ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
構造 他のクラスの構造体を別...
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
import と extends について
-
Java リフレクションについて
-
無名パッケージからのインポート
-
visual studioのデザイナ画面で...
-
ひとつのファイルにクラスは1つ?
-
違うクラスからの変数の共有化
-
C#のクラスライブラリでメッセ...
-
継承したクラス側のクラス名の取得
-
Java
-
java-別クラスの変数の使い方を...
-
C# インターフェイスの実装
-
デシリアライズでオブジェクト...
おすすめ情報