sundev

【Java】イレイジャについて調べた

2023/02/10

Java

article

イレイジャ
「パラメタライズド・タイプ」を削った「シグネチャ」

イレイジャ方式
実行時に「クラス名/メソッド名+引数の型」で解決するのではなく、「クラス名/メソッド名」だけで解決すること

※ パラメタライズド・タイプ:
パラメータ引数タイプ → つまりジェネリクス
※ シグネチャ:
メソッド名/クラス名と引数の数、引数の型、引数の順番 → つまり構文(型引数を除いた)

クラスにおけるイレイジャ

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

© 2023 sundev All Rights Reserved.