看看这个:
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()
,但它是键入的。
最佳答案
你不能在运行时设置对象的类型;您只能创建特定类型的实例。一旦创建了 GenericFoo
的实例,就无法设置它的类型参数。 (由于 type erasure ,这在运行时甚至没有意义。)
你能做的最好的事情就是这样:
private static class GenericFoo<T extends BaseClass>
{
T createInstance(Class<T> clazz)
{
return clazz.newInstance();
}
}
关于java - 我们可以通过调用 class#newInstance() 创建类型化类的实例吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163982/