【问题标题】:Generating new Instance of Class fails at Runtime [duplicate]在运行时生成新的类实例失败[重复]
【发布时间】:2015-11-03 19:58:10
【问题描述】:

我遇到了 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

【问题讨论】:

  • 因此提供 MCVE 的重要性。

标签: java generics


【解决方案1】:

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

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

使你的内部类static 将解决这个问题。您还可以通过将 ABC 类移出 Main 类来解决此问题。

【讨论】:

  • 好地方!我已经盯着这个看了五分钟了。
  • 谢谢你的回答...我没想到:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多