跳到主要內容

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

Mac OS X 10.6 同步收取 Gmail, how?

在 Apple 官方的 Mac OS X 10.6 介紹網頁中, 雖然並沒有在內建的郵件軟體 - Mail 著墨太多. 但是實際上 Mail 也做了一些改善, 讓使用可以更方便, 而這篇文主要目的就是說明怎麼讓 Mail 與 Gmail 進行同步. 在過去使用郵件軟體收取電子郵件的使用經驗中, 往往都需要輸入很多資料, 什麼 "寄件伺服器" "收件伺服器" "通訊協定"... 等等等, 這對一般用戶來說, 只能說是災難. 畢竟沒學過那些專有名詞, 天曉得那是些什麼東西!? 而 Mac OS X 10.6 中的 Mail 不同了, 現在只需要輸入 Email 帳號及密碼, 軟體自動搞定細部設定! 有沒有這麼簡單!? 手邊有 Hotmail 的朋友可以試試看, 只要輸入帳號密碼, 10.6 的 Mail 就會幫你設定好其它需要設定的資料. 不過今天的主角是 Gmail 啦! 而要使用的是 Gmail 提供的 IMAP 的功能, 在使用前得先到 Gmail 中進行一些簡單的設定, 當然小弟也會說明這樣設定的理由 :) OK! Here we go!!!

關於 Polymorphism! 是的, 就是多型!

這幾天真的是寫了好多關於程式基礎的東西, 今天心血來潮想寫個物件導向的特性 - Polymorphism. 是的, 你沒看錯, 就是多型. 多型, 這有什麼好寫的呀? 每本物件導向的書籍, 不管是程式語言或是方法論, 一定都會提到的基本特性. 去書局翻翻就有了, 甚至在網路上搜尋 “物件導向” “多型”, 就可以找到讀也讀不完的資料. 在這老調重彈, 似乎有點... 多餘? 會想把這個議題拿出來講, 關鍵就在於我發現 Objective-C 上的多型, 和我以前認識的不太一樣, 更加 Powerful.