2015-11-03 83 views
1

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

我怎样才能让这行得通?
感谢您的帮助。

BTW:我使用的是jre1.8.0_65

+0

因此提供一个MCVE的重要性。 –

回答

5

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

非静态成员类的构造函数为它们的封闭类的实例带一个隐式参数。

使你的内部类static将解决这个问题。您也可以通过将A,BC类移出Main类来解决问题。

+1

好点!我一直盯着这五分钟。 –

+0

谢谢你的回答......我没有想到:D – Krustenkaese