[解決済み】Java:ジェネリック型からクラスリテラルを取得するにはどうすればよいですか?
質問
一般的には、このようにクラスリテラルを使うことが多いようですね。
Class<Foo> cls = Foo.class;
しかし、型が一般的なもの、例えばListの場合はどうでしょうか?これは問題なく動作しますが、Listはパラメータ化されるべきなので、警告が発生します。
Class<List> cls = List.class
では、なぜ
<?>
? さて、これでは型の不一致エラーが発生します。
Class<List<?>> cls = List.class
こんな感じでうまくいくと思ったのですが、これは単なる構文エラーです。
Class<List<Foo>> cls = List<Foo>.class
どうすれば
Class<List<Foo>>
は、クラス・リテラルを使用するなどして、静的に使用できますか?
I
かもしれない
使用
@SuppressWarnings("unchecked")
を使えば、最初の例でパラメータ化されていないListの使用によって引き起こされる警告を取り除くことができます。
Class<List> cls = List.class
ということなのでしょうが、私はそうしたくないのです。
何か提案はありますか?
解決方法は?
が原因でできません。 タイプ・イレーズ .
Javaジェネリックスは、オブジェクトキャストのための構文上の糖分に過ぎません。実証するために
List<Integer> list1 = new ArrayList<Integer>();
List<String> list2 = (List<String>)list1;
list2.add("foo"); // perfectly legal
一般的な型情報が実行時に保持される唯一の例として
Field.getGenericType()
もしリフレクションによってクラスのメンバに問い合わせるなら。
これらのことは、なぜ
Object.getClass()
にはこのような署名があります。
public final native Class<?> getClass();
重要なのは
Class<?>
.
別の言い方をすれば Java Generics FAQ :
具体的なパラメタライズド型にクラス リテラルがないのはなぜですか?
パラメータ化された型は正確な実行時型表現を持っていないため。
クラスリテラルは
Class
オブジェクトは、与えられた型を表します。 たとえば、クラス リテラルのString.class
はClass
オブジェクトを表します。String
と同じでありClass
オブジェクトが返されます。 メソッドgetClass
を呼び出すとString
オブジェクトを作成します。クラスリテラルは 実行時の型チェックに使用され を使用します。パラメータ化された型は、その型 に変換されたときに バイトコードでコンパイルされます。 型消去と呼ばれる処理です。そのため 型消去の副作用として、すべての 汎用型のインスタンス化は 同じ実行時表現であること。 すなわち、対応する生の 型があります。 言い換えれば,パラメータ化された は型表現を持っていません。 である。したがって クラスリテラルを形成する意味がない のような
List<String>.class
,List<Long>.class
とList<?>.class
がないため、このようなClass
オブジェクトが存在します。 生の型であるList
にはClass
オブジェクトは、そのランタイムを表す タイプになります。と呼ばれる。List.class
.
関連
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] enumのordinalを使用するのは良い習慣ですか?
-
[解決済み] コレクションへの共有参照が見つかりました org.hibernate.HibernateException
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6
-
[解決済み] Java: getInstanceとStaticの比較
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない
-
[解決済み] IntegerからBigIntegerへの変換