3

Java では、型パラメーターのインスタンスを作成できないことを知っています。多くの記事では、単純に「Type Erase」が理由として挙げられています。しかし、型パラメーターの初期化は型消去の前に発生しませんか? Type Erase が唯一の理由ですか? 次に例を示します。

public class GenObj {
    public static <E> void append(List<E> list) {
        E elem = new E();  // compile-time error
        list.add(elem);
    }
    public static main(){
        List<String> list= new ArrayList<String>();
        GenOjb.append<String>(list);
    }
}

GenOjb.append(list) を使用してジェネリック メソッドを呼び出すと、コンパイラはメソッド内の E を最初に String に置き換えてから、"Type Erase" を実行すると思いますが、それは正しいですか? もしそうなら、E が実際にデフォルトのコンストラクターを持っていることを保証する方法がある限り、型パラメーターのインスタンスを作成できるはずです。Java がパラメーター型のインスタンスの作成を許可しない理由を誰かが詳しく説明できますか? ありがとう。

4

4 に答える 4

4

質問することは有益です:ジェネリックなしでどのようにしますか?

ジェネリックを使用するすべてのプログラムは、ジェネリック パラメーターを削除し、適切な場所にキャストを挿入するだけで、ジェネリックを使用しない同等のプログラムに変換できます。これを型消去と呼びます。したがって、ジェネリックでできるかどうかを知りたい場合は、まずジェネリックなしでできるかどうかを確認する必要があります。

Generics がない場合、プログラムは次のようになります。

public class GenObj {
    public static void append(List list) {
        Object elem = // what goes here?
        list.add(elem);
    }
    public static main(){
        List list= new ArrayList();
        GenOjb.append(list);
    }
}
于 2013-12-27T22:24:42.373 に答える
3

実行時の型の消去により、その型は使用できません。

ただし、タイプ トークンを渡すことはできます。

public static <E> void append(List<E> list, Class<E> c) {
    E elem = c.newInstance();
    list.add(elem);
}

これは、クラスに引数のないコンストラクターがあることを前提としています。

于 2013-12-27T06:07:36.353 に答える