2015-11-03 89 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