java - 在运行时生成类的新实例失败

标签 java generics

<分区>

我遇到了 java 和泛型类的问题。
给定以下代码

public class A {
    public void n() { 
        System.out.println("In A"); 
    }
}

public class B extends A {
    @Override
    public void n() {
        System.out.println("In B");
        super.n();
    }
}

public class C {
    public A m_a;
    public <T extends A> C( Class<T> a ) {
        try {
            m_a = a.newInstance();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
    public void print(){ m_a.n(); };
}

我尝试如下实例化 C 类的对象

C c = new C( B.class );

但出现以下错误:

java.lang.InstantiationException: testdbvsfile.Main$B
    at java.lang.Class.newInstance(Unknown Source)
    at testdbvsfile.Main$C.<init>(Main.java:63)
    at testdbvsfile.Main.main(Main.java:76)
Caused by: java.lang.NoSuchMethodException: testdbvsfile.Main$B.<init>()
    at java.lang.Class.getConstructor0(Unknown Source)<br>
    ... 3 more

我怎样才能让它发挥作用?
感谢您的帮助。

顺便说一句:我正在使用 jre1.8.0_65

最佳答案

问题是您使用的是非静态内部类。这从堆栈跟踪中可以明显看出,其中 Main$BB 类的名称,它的声明中缺少 static

非静态成员类的构造函数采用隐式参数及其封闭类的实例。

将内部类设为static 将解决此问题。您还可以通过将 ABC 类移出 Main 类来解决此问题。

关于java - 在运行时生成类的新实例失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507949/

相关文章:

java - 按升序打印二进制数

java - 如何将时间戳字符串转换为纪元时间?

Java 泛型 - 无限通配符中的真正含义是什么?

delphi - 有没有办法从通用约束类型获取 GUID?

c# - 从方法签名中删除通用参数

java - 序列化和反序列化以及将内部写入文件然后读取它们并将它们传递给构造函数之间的区别

java.lang.NoSuchMethodError : com. mongodb.MongoClient.<init>(Ljava/util/List;Lcom/mongodb/MongoCredential;Lcom/mongodb/MongoClientOptions;)V]

java - java 和 servlet 的类路径

java - 返回具有通用类型的接口(interface)时出错

java - 具有相同基类的泛型