【Java】イレイジャについて調べた
2023/02/10

イレイジャ
「パラメタライズド・タイプ」を削った「シグネチャ」
イレイジャ方式
実行時に「クラス名/メソッド名+引数の型」で解決するのではなく、「クラス名/メソッド名」だけで解決すること
※ パラメタライズド・タイプ:
パラメータ引数タイプ → つまりジェネリクス
※ シグネチャ:
メソッド名/クラス名と引数の数、引数の型、引数の順番 → つまり構文(型引数を除いた)
クラスにおけるイレイジャ
Javaでは、クラスを型変数の違いで特定できない、つまり同名で型変数違いのクラスを定義できない
以下は宣言できない(エラー)
class Hoge<T> {};
class Hoge<T, U> {};
特定はクラス名でのみできる → 特定するものが「イレイジャ」
例えば、java.util.ArrayList<String>のイレイジャは|java.util.ArrayList|
メソッドにおけるイレイジャ
クラスの型引数違いの宣言はできない。
では、メソッドの型変数の違いによるオーバーロードはどうなる?
→ できない
以下はオーバーロードとならない(エラー)
hogeMethod(List<String> list)
hogeMethod(List<Integer> list)
どちらもイレイジャは|java.util.List| となるため同一のメソッドとみなされる
コンパイル時のイレイジャ
イレイジャ情報 + パラメタライズド・タイプ情報を持つ
コンパイラとしては型推論をするためパラメタライズド・タイプが必要なため
コンパイラ時点でパラメタライズド・タイプ情報がないと以下のようなことになる
List<Integer> list = new ArrayList<>(); // 型引数省略(型推論)
hoge(list); // エラー
public void hoge(List<String>) { ~ };
実行時のイレイジャ
イレイジャ情報のみ持つ(パラメタライズド・タイプ情報はなし)
イレイジャでクラスやメソッドを特定するため、イレイジャが同一のクラスやオーバーロードを定義できない
→ 実行時にはイレイジャのみの情報で事足りる
実行時に削除するからType Erasure なのでなく、シグネチャ解決にはイレイジャのみで十分だからType Erasure なのであるという理解が重要
まとめ
ジェネリクスがない時代のコードと互換を得るため、クラスやオーバーライドの判別はイレイジャ方式となった。
開発者としてのメリットは特になさそう。
RECOMMENDED