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就无法设置它的类型参数。(由于type erasure,这在运行时甚至没有意义。)

你能做的最好的事情是这样的:

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

您正在尝试混合泛型和反射。类型安全仅在编译时可用。但是,如果您想使用当前配置创建简单对象,您可以这样做

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