看看这个:
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()
来创建实例,但它是键入的。
答案 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>();