2015-04-23 52 views
0

我有一個類正在實現與泛型的接口。ClassCastException:類實現接口,仍然獲得classcast

class MainClass { 
    interface MyInterface <T extends MyInterface.A> { 
     static class A { 
     } 
    } 
} 

//I have another class which implements this interface: 
class ImplementingClass implements MyInterface<A> { 
} 

//I am loading MyInterface class from a jar in a different place: 
static loadJar(){ 
    String dexPath = new ContextWrapper(context).getCacheDir().getAbsolutePath(); 
    DexClassLoader classLoader = new DexClassLoader(JAR_FILE, dexPath, null, ClassLoader.getSystemClassLoader()); 
    Class c = classLoader.loadClass("ImplementingClass"); 
    MyInterface nvQS = (MyInterface) c.newInstance(); 
} 

我得到了類拋出異常。我不確定這是爲什麼?該類正在實現接口。我也嘗試了泛型,但我仍然得到了例外。

如果我不清楚,請讓我知道。謝謝。

包括異常: java.lang.ClassCastException:ImplementingClass不能轉換到MainClass $ MyInterface的

嘿,界面是建立在Android的Java靜態庫。 jar和jar加載器將被編譯爲單獨的副本嗎?那是問題嗎?你認爲這就是爲什麼我會得到一個班級演員?

+0

你遇到了什麼異常?您尚未提供堆棧跟蹤。通常,異常中的錯誤消息會明確地告訴您具體是什麼問題。 – azurefrog

+0

你使用IDE嗎?我建議你使用Debug來查看對象「c」。看到它是課堂。 – MageXellos

+0

是的,我做到了。 「已加載類的名稱:ImplementingClass」 – user2248720

回答

0

所以問題是接口是一個靜態庫。因此,由於jar和它加載的代碼是分開編譯的,所以它們不被java認爲是同一類。我使它成爲一個共享庫,它工作正常,沒有例外。 :-)

0

您正在創建與MyInterface不同的新接口MainClass.MyInterface。如果您實施MainClass.MyInterface並投射到MainClass.MyInterface那麼它應該工作。這可能可以通過選擇更好的名字來避免。

不要與軟件包混淆,如果包含MainClass,則可以跳過它們。

+0

導入時,我包括類名。所以在使用時我可以直接使用接口名稱嗎?也許這不是問題?也爲名稱道歉。我以爲我在簡單。下次我會保留原來的名字。謝謝。 – user2248720

+0

@ user2248720就我所知,如果您有另一個類中的接口,則不能這樣做。然後你需要在前面編寫包含接口的類。軟件包可以跳過。也許它取決於java版本。 – maraca

+0

那麼這應該會給我一個編譯器錯誤呢?它編譯好。我正在使用Java版本7 – user2248720