0

これを見てください:

package test;

public abstract class BaseClass {
    public abstract void doSomething();
}


package test;

public class A extends BaseClass {

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
        System.out.println("A");
    }

}


package test;

public class GenericFoo<T extends BaseClass>{

    public GenericFoo(){

    }

    private T instance;

    public void  setType(String type){
        // client code  call this to set concrete type of T
    }

    public void doSomething(){
        instance.doSomething();
    }

    public static void main(String s) throws InstantiationException, IllegalAccessException{
        GenericFoo<?> obj = GenericFoo.class.newInstance();
        obj.setType("A");
        // I want  it to print "A" on console
        obj.doSomething();

    }
}

これを実装する方法、私のクラスは呼び出しを使用してインスタンスを作成することのみが許可されています class#newInstance()が、それは型指定されています。

4

2 に答える 2

4

実行時にオブジェクトのタイプを設定することはできません。特定のタイプのインスタンスのみを作成できます。のインスタンスGenericFooが作成されると、そのタイプパラメータを設定する方法はありません。(型消去のため、実行時にも意味がありません。)

あなたができる最善のことは次のようなものです:

private static class GenericFoo<T extends BaseClass>
{
    T createInstance(Class<T> clazz)
    {
        return clazz.newInstance();
    }
}
于 2012-04-15T17:00:23.753 に答える
0

GenericsとReflectionsを混ぜようとしています。タイプセーフは、コンパイル時にのみ使用できます。ただし、現在の構成を使用して単純なオブジェクトを作成する場合は、次のように実行できます。

 GenericFoo<?> obj = new GenericFoo<BaseClass>();
 GenericFoo<BaseClass> obj = new GenericFoo<BaseClass>();
于 2012-04-15T16:50:52.033 に答える