7

このクラスを想像してください:

public class ObjectCreator<T> {
    private Class<T> persistentClass;

    public ObjectCreator(Class<T> persistentClass) {
        this.persistentClass = persistentClass;
    }

    public T create() {
        T instance = null;
        try {
            instance = persistentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } 

        return instance;
    }
}

次に、ドメイン オブジェクトでサブクラス化します。

public class PersonCreator extends ObjectCreator<Person>{

    /**
     * @param persistentClass
     */
    public PersonCreator() {
        super(Person.class);

    }

}

すべてがうまく機能します...しかし、別の汎用ドメインオブジェクトでサブクラス化しようとすると、コンパイラは不平を言います:

public class MessageCreator extends ObjectCreator<Message<String>>{

    /**
     * @param persistentClass
     */
    public MessageCreator() {
        super(Message.class);
    }

}

コンストラクターObjectCreator<Message<String>>(Class<Message>)は未定義です MessageCreator.java

これは大きな制限だと思います。なぜこれが禁止されているのですか?

回避する方法はありますか?

マッシモ

4

3 に答える 3

3

これを試して:

super((Class<Message<String>>) ((Object) Message.class)); //compiles with warning

基底クラスのコンストラクタを

public ObjectCreator(Class<? extends T> persistentClass)

そして、これを派生クラスで使用します。

super(new Message<String>(){}.getClass()); //compiles without warning

警告なしでコンパイルされます

編集

getClass() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#getClass ()の定義によると

ここで、X はgetClassClass<? extends X>が呼び出された式の静的型の消去です。匿名クラスのforおよびforgetClass()を返すことを意味しますClass<? extends Message>new Message<String>()Class<? extends Message<String>>new Message<String>(){}

于 2013-01-12T18:18:34.163 に答える
1

ジェネリック クラスの '.class' バリアントはありません。情報は実行時に利用できませんが、上記のコードをコンパイルするには、式を必要な型にキャストするだけです。

super ((Class<Message<String>>)((Class<?>)Message.class));

これにより、実行時に情報が利用可能になるわけではありませんが (つまり、リフレクションなど)、未チェックの警告でコンパイルする必要があることに注意してください。これはまさに警告です。

于 2013-01-12T18:08:52.563 に答える
0

使用するだけで機能します

public class MessageCreator extends ObjectCreator<Message>{

    /**
     * @param persistentClass
     */
    public MessageCreator() {
        super(Message.class);
    }

}

これにより正しいオブジェクトが作成されますが、それでもクラス定義に対して警告が表示されます。

Message<String> m = creator.create();
于 2013-01-12T18:12:13.840 に答える