Javaジェネリックス スーパーキーワード
質問事項
私はこれらのトピックに目を通しました
しかしながら、私はまだ
super
というキーワードで迷っているようです。
-
このようにコレクションを宣言すると
List<? super Number> list = null; list.add(new Integer(0)); // this compiles list.add(new Object()); // this doesn't compile
の親である(型が不明な)いくつかのオブジェクトを含むリストがあります。
Number
. つまり
Object
は適合するはずです (これは
Number
の親なので)、そして
Integer
はいけない。その逆がなぜかあるのです。
-
次のようなコードがあることを条件とします。
static void test(List<? super Number> param) { param.add(new Integer(2)); } public static void main(String[] args) { List<String> sList = new ArrayList<String>(); test(sList); // will never compile, however... }
上記のコードをコンパイルすることは不可能ですが (そして私の正気は、これが正しい振る舞いであることを示唆しています)、基本的なロジックはその逆を証明することができます。
String is Object, Object is superclass of Number. So String should work.
おかしな話ですが、これが原因で
<S super T>
の構成を許可しなかった理由ではないでしょうか?もしそうなら、なぜ
<? super T>
が許可されているのでしょうか?
誰かこのロジックチェーンの欠けている部分を復元するのを手伝ってくれませんか?
どのように解決するのですか?
の bounded ワイルドカードは
List<? super Number>
を捕捉することができます。
Number
とその上位型のいずれかを捕捉することができます。したがって
Number extends Object implements Serializable
によって捕捉変換可能な唯一の型であることを意味します。
List<? super Number>
である。
-
List<Number>
-
List<Object>
-
List<Serializable>
ただし
add(Integer.valueOf(0))
を使うことができます。
できない
add(new Object())
を
List<Number>
または
List<Serializable>
というのは、一般的な型安全性のルールに違反するからです。
したがって、それは
NOT
というのは誤りです。
add
の任意のスーパータイプは
Number
を
List<? super Number>
に変換します。これは、境界付きワイルドカードとキャプチャ変換がどのように動作するかということではありません。を宣言するのではありません。
List<? super Number>
を追加したいからです。
Object
を追加したいからです (できない!)。
Number
オブジェクトを追加したいからです (つまり、このオブジェクトは
Number
の消費者である)、そして単に
List<Number>
は制限しすぎです。
参考文献
-
Angelika Langerのジェネリック医薬品に関するFAQ
- bounded wildcard とは何ですか?
- 下限を持つワイルドカードのパラメータ化された型はいつ使うのでしょうか? ("When a concrete parameterized type would be too restrictive.")。
- なぜ型パラメーターの下限がないのですか? ("Because it doesn't make sense.")です。
- JLS 5.1.10 キャプチャ変換
参照
-
エフェクティブ ジャバ 第2版
項目28:APIの柔軟性を高めるために境界付きワイルドカードを使用する
-
PECS はプロデューサーを意味します。
extends
消費者super
-
PECS はプロデューサーを意味します。
関連する質問
-
多すぎてリストアップできない、PECS。
new Integer(0)
対valueOf
など
関連
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
Junitのユニットテストはjava.lang.Testを報告します。
-
java.sql.SQLException: 結果セットの開始前
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。