2012-06-28 88 views
0

Enumjava.lang.Enum中,並且Objectjava.lang.Object中。那麼,爲什麼Enum不是Object? (我得到一個java.lang.ClassCastException我想擴展枚舉和對象(generic)

我想打一個類,它可以同時接受ObjectEnum,像這樣...

public class MyType<T extends Enum<T>, Object> { 

但是,這給出了一個編譯錯誤。我怎樣才能使我的MyType,以便它可以接受所有(或兩個)類的類? (EnumObject)?

回答

1

枚舉是一個對象。見http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html 所以

MyType<Object> { 

應該工作。

+0

謝謝你的回答。我的第一個問題解決了。但是,我不能投T []枚舉[]類型。 ex,枚舉ITEM {}; myType = new MyType (); ITEM [] items = myType.getData(); // getData()返回T []。爲什麼不能施放?在控制檯:java.lang.ClassCastException:[Ljava.lang.Object;不能轉換爲[Ljtrix.manager.ItemManager $ ITEM; –

+0

很高興我能幫到你。你可能想要upvote和/或接受:-)編輯:我現在看到你的補充:因爲這是一個不同的問題,我會張貼在不同的線程! –

+0

數組類型是協變的,這意味着'Object []'是任何'MyType []'的*超類*。換句話說,'MyType [] instanceof Object []'是'true',而反過來顯然是'false'。您無法將Object []轉換爲任何其他數組類型。還要注意數組的類型是它的運行時屬性,而不是像泛型那樣的編譯時。 –

2

由於每一個Java對象是instanceof Object,沒有什麼好做比申報MyType<?>沒有界限。這將捕獲任何類型,包括枚舉類型。

0

你可以看到documentation

對象除外,它沒有超類,每一類有一個和 只有一個直接超類(單繼承)。在沒有任何其他顯式超類的情況下,每個類都隱含地爲 對象的子類。

你可以得出結論:

  1. 甚至沒有明確的類將從Object延伸;
  2. 如果Object是想通的方式來代表其他類,你將不能夠因爲Java不支持多重繼承。單單看Object類的API
0

,你可以閱讀:

Class Object is the root of the class hierarchy. Every class has Object as a superclass. 
All objects, including arrays, implement the methods of this class. 

這意味着Enum是一個對象(你可以通過查看JavaDoc中Enum藏漢驗證)。因此,如果您只是簡單地告訴MyType包含對象(MyType<Object>),它將接受最初發布的對象和枚舉。

雖然通知,這可能會導致不必要的行爲,被認爲是不安全的,因爲所有的類都是對象。

0

我不認爲你已經正確地指出你的問題。我想你想讓你的班級接受EnumObject。當你這樣說時,你可以看到這是唯一可能的選擇。

如果你想要接受EnumObject,這相當於說「接受Enum」。在這種情況下>是答案。