[解決済み] javaのランタイムでジェネリックがどのように動作するのか?
2022-02-19 22:25:21
質問内容
私は興味深い問題に遭遇しました。私はいくつかのサードパーティのAPIコールから生のリストを取得し、それはその中にCustomObjectを含んでおり、私はそのリストをString型の属性のリストに保持しています。
List<String> strList = getCustomObjectList();//This is third part API
which resturn raw List
今度はリスト要素を取得したい
String myStrValue = strList.get(0);
ここで、以下の例外が発生しました。
<ブロッククオートjava.lang.ClassCastException: com.some.CustomObject は次のようにキャストできません。 java.lang.String
今、私は2つのことを知りたいと思っています。
-
Genricsはコンパイル時の型チェックの概念であり、実行時にどのように例外を投げるのですか?
-
このような場合、ランタイムのタイプキャスティングはどのように行われるのでしょうか?
解決方法は?
コンパイル時に、コンパイラは安全でない代入についての警告を出します(生の
List
を
List<String>
変数を含むサードパーティのAPI)は、後方互換性のために代入が許可されています。
getCustomObjectList()
メソッドは、Java 5でジェネリックが導入される前に書かれた可能性があります)。
実行時
strList.get(0)
は
Object
しかし、その
Object
にキャストされます。
String
のため
List<String>
タイプ
strList
. キャスティングを行うコードはコンパイル時にコンパイラによって追加されますが、ランタイム時にのみキャスティングが行われ、ランタイムの型である
strList.get(0)
でない場合は
String
.
関連
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
最新
-
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で指定されたファイルが見つからない
-
[解決済み】スレッド「main」での例外 java.lang.StringIndexOutOfBoundsException: 文字列のインデックスが範囲外です。0 [閉店]
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】破損したjarファイル
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない