OracleのWebサイトで Javaの型消去について読みました。
型消去はいつ発生しますか?コンパイル時または実行時ですか?クラスが読み込まれると?クラスがインスタンス化されるのはいつですか?
多くのサイト(上記の公式チュートリアルを含む)では、型の消去はコンパイル時に行われるとしています。コンパイル時に型情報が完全に削除された場合、ジェネリックを使用するメソッドが型情報なしまたは誤った型情報で呼び出された場合、JDKはどのように型の互換性をチェックしますか?
次の例を考えてみます。クラスA
にメソッドがあるとしempty(Box<? extends Number> b)
ます。A.java
クラスファイルをコンパイルして取得しますA.class
。
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
次に、パラメーター化されていない引数(rawタイプ)を使用しB
てメソッドを呼び出す別のクラスを作成します。クラスパスでコンパイルすると、javacは十分に賢く警告を発します。だから、持ってそれに保存されているいくつかのタイプの情報を。empty
empty(new Box())
B.java
A.class
A.class
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
私の推測では、クラスがロードされると型の消去が発生しますが、それは単なる推測です。それでそれはいつ起こるのですか?