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

时间:2015-11-03 19:58:11

标签: 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

1 个答案:

答案 0 :(得分:5)

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

非静态成员类的构造方法将隐式参数与其封闭类的实例一起使用。

制作内部课程static将解决此问题。您还可以通过将ABC类移出Main类来解决问题。