跳到主要內容

驚!原來 instanceof 有這樣的限制

我一直以為 instanceof 是測試某個物件是否為某個類別的實體,實際上語法看起來也是這樣。

String aString = "a string";
boolean bool = aString instanceof String;
System.out.println(bool);

想當然爾,結果當然是 true。
只是我萬萬沒想到,instanceof 有個限制,只能拿來判斷同繼承樹中的類別。
這是什麼意思?直接看範例:

String aString = "a string";
boolean bool = aString instanceof Double;
System.out.println(bool);

結果會是什麼呢?是 false 嗎?
錯了!是 Compile Error!

inconvertible types
found   : java.lang.String
required: java.lang.Double
        boolean bool = aString instanceof Double;
1 error

這和我預期的有點出入,限定只能判斷同一繼承樹上的類別大大減低實用性。
我想要的效果就如同字面,是否為某類別的實體(物件),是 => true,不是 => false。

回頭看看 Objective-C,
NSObject 定義了某個類似 intanceof 的方法:

- (BOOL)isKindOfClass:(Class)aClass; 

效果如何呢?看個範例:

NSArray *array = [NSArray array]; 
BOOL arrayIsString = [array isKindOfClass:[NSString class]];
NSLog(@"NSArray is Kind of NSString: %@", (arrayIsString ? @"YES" : @"NO"));

印出來的結果是 "NSArray is Kind of NSString: NO",沒有跳出錯誤!
這才是我想要的 instanceof 啊!! Orz...
Java 加油~好嗎?

留言

這個網誌中的熱門文章

誰讓你心動, 誰讓你心痛, 誰會讓你偶而想要擁他在懷中... 誰又在乎你的夢, 誰說你的心思他會懂, 誰為你感動... 許久沒聽到這熟悉的詞與曲, 更懷念那甜美細膩的好嗓音. 於是趁著空檔, 拿出了放在那如同收藏我的回憶般, 收藏櫃子裡頭的兩張專輯.

引數?! 參數??!! 什麼鬼啊!!

我想這個不僅是只有我會遇到的問題, 大概也是所有 Programming 的人都有的疑惑 (應該是吧?) 什麼引數?? 什麼參數?? 天啊... 到底是誰翻譯的呀!!!! 就字面上來看... 講句實在話, 我真的不了解, 大概是學藝不精所致. 也許有些人認為 => 管它那麼多!! 寫得出來就好了!! 不過龜毛如我, 我還是想搞清楚定義是什麼!

關於 Objective-C 的基本功

就在 iPhone 開創了智慧型手機軟體市場後, 市面上出現了很多關於 iPhone 平臺的開發教學書籍. 但是, 關於 iPhone 使用的程式語言 Objective-C 的書呢? 這種練基本功的書籍卻是少得可憐. 而龜毛如我, 只曉得怎麼使用 Cocoa framework, 卻不曉得基礎程式語言怎麼運作, 老是覺得渾身不自在. 就在打算入手 "Programming in Objective-C 2.0" 這本英文書的同時... 我發現 => 中文版出了!!!! 這對要使用 Objective-C 來寫程式的我, 無疑是一種福音. 無論是在價格上, 或使用的文字上. XDDD~