2010-07-21 95 views
2

有兩類如何在Java中將其他類轉換爲相同的類而不是其他類?

foo.bar.FileUploaderbarbar.foofoo.FileUploader

兩者都是相同的,並且在代碼中foo.bar.FileUploader用於延伸Uploader

某處並給出作爲參數傳遞給我的函數作爲Uploader類型。

現在我需要把它回到FileUploaderbarbar.foofoo.FileUploader。這給出了一個錯誤:

ERROR - unhandled error java.lang.ClassCastException : foo.bar.FileUploader cannot be cast to barbar.foofoo.FileUploader

我想不出什麼錯誤,我想這是因爲包是不同的。在這種情況下:是否有辦法繼續使用這個類並完成演員?

回答

-1

感謝您的幫助。

我剛剛通過導入barbar解決了問題。foofoo.FileUploader。現在它運行良好!

7

從技術上講,他們不是同一個班級。

您正在收到ClassCastException,因爲JVM根本沒有看到它們是同一類型的。也許你應該讓這兩個類實現相同的接口並轉換爲這個接口?或者,也可以先放一個班,擺脫演員陣容?

4

對於Java,類不相同。考慮這個

package zoo; 
public interface Animal {} 

package zoo.london; 
public class Lion implements Animal{} 

package zoo.newyork; 
public class Lion implements Animal{} 

即使兩個Lion類的實現是相同的,他們都實現一個共同的接口,你可以不投,反之亦然像

zoo.london.Lion lion = (zoo.london.Lion) new zoo.newyork.Lion(); // ClassCastException 
+4

會給我的世界ClassCastException – Kennet 2010-07-21 08:25:31

+0

這將無法正常工作,因爲類是不同的(即使它們寫入相同)。從錯誤中可以清楚地看出,問題不在於他演員的角色,因爲他表示他正試圖從一個角色轉到另一個角色。這只是一個解決方案,如果你不知道如何調用演員,因爲你使用的是簡短的類名,並且不知道如何投射到特定的演員,即使如此,它也只會在foo.bar .FileUploader是barbar.foofoo.FileUploader的子項,不是一個不同的類,如果你確定知道barbarUploader是子類的一個實例。 – 2010-07-21 08:29:00

+0

@Kennet,@Andrei - ...我在編輯你的評論。當然,你是對的,沒有仔細閱讀這個問題。 – 2010-07-21 08:30:06

2

這兩個類foo.bar.FileUploader和barbar.foofoo.FileUploader的NOYT與它們在不同名稱的不同地方定義的相同。因此,java認爲他們彼此沒有任何關係,如果你想然後相同,那麼你必須做出相同的類,即導入整個包。開始重構可能是最容易的,以使其中一個擴展另一個。

2

其他人已經說過了:上課不一樣,只是因爲他們看起來像。 類是否實現/擴展相同的接口/抽象類?強制轉換爲接口或抽象類,它們都被擴展並使用它們。你所要做的只是JVM不支持。 JVM不關心這些類是否相同。如果它們真的100%相同,那顯然是一個混亂的設計,刪除其中一個類。

Java Language Specification準確地描述了你被允許施放什麼,什麼不施放。

1

擺脫重複的代碼。即使它現在可以工作,因爲兩個類都是相同的,如果某人編輯了A類並忘記了B類,會發生什麼?

編輯:你說他們是相同的,所以我猜他們是副本。那會很糟糕。但由於它們都延伸Uploader,因此您可以投到Uploader而不是FileUploader

+0

你是絕對正確的,但班級出來了我們的圖書館,但失去了舊的依賴需要工作。在進一步的項目中,我們一定會採取不同的方式。 – baklap 2010-07-21 12:36:27