java - 我们可以通过调用 class#newInstance() 创建类型化类的实例吗

标签 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() ,但它是键入的。

最佳答案

你不能在运行时设置对象的类型;您只能创建特定类型的实例。一旦创建了 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/

相关文章:

java - 无法使用 xjc 编译器和绑定(bind)文件从 wsdl 文件生成顶级 JAXB

java - 线性链表的深拷贝

java - 限制 Java 中的类型以用于列表

c# - 序列化在 c# 中实现 IEnumerable 的自定义泛型类型

c# - 用泛型方法调用泛型方法

java - 使用 Mockito 测试 void 方法

java - Struts2注解@RequestParameter

java - 我正在开发一个简单的 Spring Boot 应用程序,它没有按照我的预期工作

Java比较泛型类型

java - 如何在 C++ 中实现 MyClass<T extends OtherClass>?