1

私が持っているとします:

ClassA extends SuperClass{ ...}
ClassB extends SuperClass{ ... }

またClassX<T extends SuperClass> { ... }

ここで、実行時に、ClassA または ClassB のいずれかであることがわかっているオブジェクトに遭遇しました。それに基づいて ClassX のインスタンスを作成したいと思います。どうやってやるの?

私が試してみました:

Class<?> className = object.getClass();
Class<className> objectx = ...

これは機能しません。

前もって感謝します!

4

3 に答える 3

0

意味がないので、これは不可能です。考えてみてください、もしあなたがこれを行うことができたら、それは何の役に立つでしょうか? 型パラメーターの唯一の目的は、コンパイル時の型チェックです。したがって、コンパイル時にわからない型パラメーターがある場合、型チェックはできず、何もできません。したがって、最初に型パラメーターを指定しても意味がありません。(ワイルドカードの使用も例外ではありません。)

于 2013-07-31T00:20:28.513 に答える
0

ClassX<SuperClass> myObj = new ClassX<SuperClass>();

ジェネリック クラスを使用すると、そのジェネリック タイプであるそのクラスに値を持つことができると言えます。

ClassX<T extends SuperClass>{
    public T value; // its just public so i dont need a setter
}

これで、次のことができます: theObjectThatIsAOrB = xy.get() //これで、ClassA または ClassB であるオブジェクトを取得できます。

ClassX<SuperClass> myObj = new ClassX<SuperClass>();
myOjb.value = theObjectThatIsAOrB;
于 2013-07-30T13:17:02.197 に答える
0

A と B のどちらが関与しているかをコンパイラが判断できる場合は、単に new を使用します。

public <T extends SuperClass> ClassX <T> makeClassXInstance( T aOrB ) {
    return new ClassX<T>();
}

一方、実行時にクラスを決定しようとしている場合は、このようなものが機能する可能性があります。しかし、バリアント型の問題に直面しています。Javaはそれを解決するのが苦手です。

public <T extends SuperClass> ClassX <T> makeClassXInstance( T aOrB ) {
    return new ClassX<T>( aOrB.getClass() );
}

public class ClassX<T>{
    public ClassX( Class<T> cls ) {...}
}
于 2013-07-31T00:39:52.123 に答える