0

MySuperClassを拡張するサブクラスがあり、次のジェネリッククラスがある場合:

public class GenericClass<M extends MySuperClass>{

    public void aMethod(M m);

}

public class SubClass1 extends MySuperClass{}

それから私はします:

SubClass1 sc1 = new SubClass1();

GenericClass<MySuperClass> msc = new GenericClass<MySuperClass>();

msc.aMethod(sc1);

パラメータ化された型が合法であるかどうかを決定する型消去はありますか?コンパイラはM extends MySuperClassその正当性を調べ、調べて判断できると思いますが、型消去がこれを処理したかどうかはわかりませんでしたか?

4

4 に答える 4

4

型消去とは、コンパイル後にジェネリック型パラメーターとインスタンス化が削除されることを指します。コンパイラはコンパイル時に型をチェックしてから、すべての型パラメータを削除します。

于 2012-08-14T19:57:24.827 に答える
3

コンパイラは、コードの一般的な定義に基づいて型の安全性を確認するものです。

型消去はコンパイル中にそれらを削除し、

ジェネリック型のすべての型パラメーターをそれらの境界に置き換えるか、型パラメーターが制限されていない場合はオブジェクトを置き換えます

于 2012-08-14T19:55:05.750 に答える
1

型安全性は、コンパイラーによって保証されるものです。型消去の唯一の仕事は、ジェネリック部分を消去して、ジェネリックがJavaに表示される前に記述されたレガシーコードとコードを下位互換性を持たせることです。したがって、消去が実行される前に、ジェネリックスとの関係であるかどうかに関係なく、コードが構文的に正しいことを確認するのはコンパイラーです。

于 2012-08-14T20:00:45.213 に答える
1

型消去は、すべてのクラスが事実上「生」(型なし)である場合の実行時のアーティファクトです。

ジェネリックはコンパイル中にのみ存在します。コンパイラーは、ジェネリック・パラメーターが範囲内にあることを確認しますが、コンパイルされたバイトコードには型情報がありません。

于 2012-08-14T20:03:40.890 に答える