2010-04-23 52 views
20

Im重寫equals()方法,我需要知道對象是否是Event的子類的實例(Event是超類)。我想要像「obj subclassof Event」這樣的東西。這怎麼做?Java - 是否有像「instanceof」這樣的「子類」?

在此先感謝!

+10

出了什麼問題'instanceof'造成你問這個問題?請張貼您的嘗試,期望和意外的一些代碼。 – BalusC 2010-04-23 15:29:51

回答

41

instanceof可以處理,就好了。

+1

是的,'如果(mysubclass instanceof事件)//堅果..' – Paolo 2010-04-23 15:28:10

+1

好東西,你甚至不必檢查'null' – 2010-04-23 15:46:51

0

如果obj是Event的子類,那麼它是一個instanceof。 obj是它從中派生出來的每個類/接口的一個實例。所以至少所有對象都是Object的實例。

1

在Java中沒有直接的方法來檢查子類。 instanceof Event將對象

的,你可以在對象上做getClass()然後使用上Class對象getSuperclass()的方法來檢查,如果超類是Event返回回真正的任何子類。

2

你可能想看看someObject.getClass().isAssignableFrom(otherObject.getClass());

+0

這隻有當你只有類信息時纔有用。但是在equals()方法中,你有兩個**實例**來滿足你的可用性。 – BalusC 2010-04-23 15:30:52

+0

是的,你說得對。我用「可能」這個詞有一個原因。例如編寫可重複使用的「equalsHelper」方法,爲您做一些初步檢查。正確的信息已經發布,所以我只是想補充一些其他的考慮。 – z5h 2010-04-23 15:35:02

31

隨着未來代碼,你可以檢查的對象是擴展事件,但不是AB Event類實例本身的類。

if(myObject instanceof Event && myObject.getClass() != Event.class) { 
    // then I'm an instance of a subclass of Event, but not Event itself 
} 

默認instanceof檢查如果一個對象是指定的類或子類(延伸或工具)在事件的任何水平的。

+0

猜猜我們有同樣的想法,但你先到這裏。 – 2010-04-23 15:39:29

+1

爲什麼要感謝您的主席:-) 另一種方法是製作事件摘要或接口,而不用費心去檢查您的對象是否是它的一個實例,因爲它不可以。 – Adrian 2010-04-23 15:43:25

9

真的instanceof應該是不夠好,但如果你想,以確保該類確實是一個子類,那麼你能提供的檢查是這樣的:

if (object instanceof Event && object.getClass() != Event.class) { 
    // is a sub-class only 
} 

由於阿德里安有點超過我的,我還會添加一種方法,你可以用通用的方法做到這一點。

public static boolean isSubClassOnly(Class clazz, Object o) { 
    return o != null && clazz.isAssignableFrom(o) && o.getClass() != clazz; 
} 

使用此方式:

if (isSubClassOnly(Event.class, object)) { 
    // Sub-class only 
} 
+0

也許也有... && clazz!= null && ...爲了完整性? :D – Paggas 2010-04-25 22:06:30

+1

@Paggas:我會認爲這是一個編程錯誤,因此想要產生NullPointerException。基本上不可能有'object instanceof null',所以爲什麼要允許'isSubClassOnly(null,object)'。 – 2010-04-26 15:36:31

相關問題