2012-12-29 48 views
2

我正在試驗泛型類,並且遇到了我無法克服的障礙。總之,我遇到了,我不明白爲什麼它被拋出的錯誤:InstantiationExceptionJava - 在Class <?上使用newInstance()的泛型類擴展myClass>:InstantiationException

在文檔就這個異常定義爲:

Thrown when an application tries to create an instance of a class using the newInstance method in class Class, but the specified class object cannot be instantiated because it is an interface or is an abstract class.

現在有我抓我的頭問題是我不使用抽象或接口關鍵字。我也聽說這可能是由於沒有默認的構造函數(我有)。只是可以肯定,我在我的代碼減少到最小的可能,但還是給出了一個錯誤:

package Sandbox; 

public class Sandbox { 


    public static void main(String[] args) { 
     Sandbox box = new Sandbox(); 
    } 

    public Sandbox() { 
     aMethod(subThread.class); 
    } 

    public void aMethod(Class<? extends superThread> type) { 
     try { 

      System.out.println("isInterface: "+type.isInterface()); 
      System.out.println("isAssignableFrom of subThread: "+type.isAssignableFrom(subThread.class)); 

      superThread t = type.newInstance(); 

     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

    private class superThread { // implements Runnable { 

     public superThread() {} 

     public void run() {} 
    } 

    private class subThread extends superThread { 

     public subThread() { 
      super(); 
     } 

     public void run() { 
      // more stuff 
     } 
    } 
} 

輸出:

isInterface: false 
isAssignableFrom of subThread: true 
java.lang.InstantiationException: Sandbox.Sandbox$subThread 
    at java.lang.Class.newInstance0(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at Sandbox.Sandbox.aMethod(Sandbox.java:20) 
    at Sandbox.Sandbox.<init>(Sandbox.java:11) 
    at Sandbox.Sandbox.main(Sandbox.java:7) 

我敢肯定,這很簡單,但我不明白這一出。我嘗試了幾件事,但沒有任何幫助。任何和所有的幫助表示讚賞。

感謝, 喬恩

回答

5

這是因爲你的內部類是私有的。簡單修復:

public static class superThread { // implements Runnable { 

    public superThread() {} 

    public void run() {} 
} 

public static class subThread extends superThread { 

    public subThread() { 
     super(); 
    } 

    public void run() { 
     // more stuff 
    } 
} 

推理是因爲Class.newInstance必須能夠訪問要創建的類的構造函數。

由於課程是私人課程,因此無法訪問。另外,爲了訪問一個非靜態的內部類,你必須擁有一個外部類(Sandbox)的現有實例,而這個實例並不具有這個實例。因此,擁有公共的非靜態或私有靜態是行不通的。

+0

是的,你完全正確。我一直在尋找錯誤的地方。謝謝。 –

+0

我很確定內部類的訪問級別與它無關。事實上,當它們公開時也會發生同樣的例外。如果它們是私有靜態的,則不會發生異常。 – VGR

1

zjagannatha指出真正的問題之後,我也找到了自己的代碼的修復方法,它允許我將方法保持爲非靜態的......實質上,我發現即使構造函數沒有參數,Constructor也會處理它就好像它有一個一樣。我得到它列出的參數,發現它需要一個Sandbox類(我假設我目前正在工作的一個)奇怪要允許非靜態類,我需要將我的newInstance代碼更改爲:

type.getConstructor(this.getClass()).newInstance(this); 

這個作品,以及