7

私は立ち往生しています。C ++から来たので、これは簡単に機能すると思いましたが、機能しません。アドバイスをいただけますか?Tに使用する各クラスで、ある種の作成メソッドになってしまわないようにします。

public class A<T>{

    private T t_;

    public A(){
        t_ = new T(); //error
    }

}  

また、コンストラクターを次のようにしたくありません:A(Class classT){...理想的にはこのc++コードのようなものが欲しいです。

template<class T>
class A{
private:
   T t_;

public:
   A(){}

};

手伝ってくれてありがとう。

4

4 に答える 4

10

型消去の問題(どのような場合でもこれを不可能にする)に加えTて、引数のないコンストラクターが公開されていることを保証することはできません。

従来の回避策は、オブジェクトを取得するために使用できるメソッドを提供するファクトリオブジェクトを渡すことTです。単純な例は次のようになります

interface Factory<T> {
  T create();
}

次に、クラスはを取得し、それをFactory<T>呼び出しcreate()てさらにTsを取得できます。createより洗練された例では、たとえば、メソッドへの追加の引数やオーバーロードが必要になる場合があります。

あまりきれいではない回避策には、明示的な反射、オブジェクトの受け渡しが含まれClass<T>ます。たとえばArrayList.class.newInstance()、新しく構築されたrawを返しますArrayList。オブジェクトを明示的に渡す必要がClassあり、リフレクションベースのアプローチは、通常のコンストラクターやファクトリオブジェクトよりも遅くなります(リフレクションの速度は最近向上していますが)。また、引数なしのコンストラクターを公開するクラスに依存しますが、常にそうであるとは限りません。それを機能させることはできますが、私が「楽しい」と呼ぶことは決してありません。

(とはいえ、参考までに、Project Lambdaやその仲間たちと一緒に、Java 8では状況が多少変わる可能性があるという兆候があります。)

于 2012-05-31T09:30:22.570 に答える
6

Javaではそのようなことはできません。型消去について読む:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

于 2012-05-31T09:29:12.477 に答える
5

失望させて申し訳ありませんが、これはコンストラクターのないJavaではまったく不可能です。

Javaは実行時に一般的な情報を破棄します(型消去を参照)

于 2012-05-31T09:30:02.307 に答える
0

これを試して:

private <E extends ISomething> E createInstance(Class<E> clazz) {
        E ret;
        try {
            ret = clazz.newInstance();
            ret.setSomething(something);

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return ret;
    }
于 2012-05-31T09:34:27.137 に答える