我们可以通过调用类#newInstance()来创建类型类的实例

时间:2012-04-15 16:46:43

标签: java generics

看看这个:

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()来创建实例,但它是键入的。

2 个答案:

答案 0 :(得分:4)

您无法在运行时设置对象的类型;您只能创建特定类型的实例。一旦创建了GenericFoo的实例,就无法设置它的类型参数。 (由于type erasure,这在运行时甚至都没有意义。)

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

private static class GenericFoo<T extends BaseClass>
{
    T createInstance(Class<T> clazz)
    {
        return clazz.newInstance();
    }
}

答案 1 :(得分:0)

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

进行
 GenericFoo<?> obj = new GenericFoo<BaseClass>();
 GenericFoo<BaseClass> obj = new GenericFoo<BaseClass>();