1. ホーム
  2. java

[解決済み] 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つのことを知りたいと思っています。

  1. Genricsはコンパイル時の型チェックの概念であり、実行時にどのように例外を投げるのですか?

  2. このような場合、ランタイムのタイプキャスティングはどのように行われるのでしょうか?

解決方法は?

コンパイル時に、コンパイラは安全でない代入についての警告を出します(生の ListList<String> 変数を含むサードパーティのAPI)は、後方互換性のために代入が許可されています。 getCustomObjectList() メソッドは、Java 5でジェネリックが導入される前に書かれた可能性があります)。

実行時 strList.get(0)Object しかし、その Object にキャストされます。 String のため List<String> タイプ strList . キャスティングを行うコードはコンパイル時にコンパイラによって追加されますが、ランタイム時にのみキャスティングが行われ、ランタイムの型である strList.get(0) でない場合は String .