ジェネリッククラスがあります
SomeClass<T>{ }
次の行を書くことができます。
SomeClass s= new SomeClass<String>();
生の型はジェネリック型のスーパータイプなので大丈夫です。しかし
SomeClass<String> s= new SomeClass();
は正しいです。なぜそれが正しいのですか?型消去は型チェック前だと思っていたのですが違います。
Hacker's GuideからJavacへ
Java コンパイラがデフォルトのコンパイル ポリシーで呼び出されると、次のパスが実行されます。
- parse:一連の *.java ソース ファイルを読み取り、結果のトークン シーケンスを AST ノードにマップします。
- enter:定義の記号を記号テーブルに入力します。
- 注釈の処理:要求された場合、指定されたコンパイル単位で見つかった注釈を処理します。
- attribute:構文ツリーの属性。このステップには、名前解決、型チェック、および定数の折りたたみが含まれます。
- flow:前のステップのツリーに対してデータ フロー分析を実行します。これには、割り当てと到達可能性のチェックが含まれます。
- desugar: AST を書き換えて、構文糖衣をいくつか取り除きます。
- generate:ソース ファイルまたはクラス ファイルを生成します。
Generic は構文シュガーであるため、4 パスで呼び出された型チェックの後、6 パスで型消去が呼び出されます。よくわかりません。