2016年5月5日 星期四

檢查物件型態

一般在 Java 中,會用 instanceof 來檢查物件的型態
不過在對於 primitive type 時,無法使用這個檢查
另外當類別只能在執行期間才會知道的情況下,也沒辦法使用 instanceof
這時可以使用類別的 isAssignableFrom() 或者 isInstanceOf() 來檢查。
範例:
public class Main {

 public static void main(String[] args) {
  System.out.println("Test int 123");
  check(123);
  
  System.out.println();
  System.out.println("Test Integer.MAX_VALUE");
  check(Integer.MAX_VALUE);
  
  System.out.println();
  System.out.println("Test Long.MAX_VALUE");
  check(Long.MAX_VALUE);
 }
 
 private static void check (Object obj) {
  System.out.println(String.format(
    "int.class.isAssignableFrom(): %s", 
    int.class.isAssignableFrom(obj.getClass())));
  System.out.println(String.format(
    "Integer.class.isAssignableFrom(): %s", 
    Integer.class.isAssignableFrom(obj.getClass())));
  System.out.println(String.format(
    "long.class.isAssignableFrom(): %s", 
    long.class.isAssignableFrom(obj.getClass())));
  System.out.println(String.format(
    "Long.class.isAssignableFrom(): %s", 
    Long.class.isAssignableFrom(obj.getClass())));
 }
}
輸出如下:

Test int 123
int.class.isAssignableFrom(): false
Integer.class.isAssignableFrom(): true
long.class.isAssignableFrom(): false
Long.class.isAssignableFrom(): false

Test Integer.MAX_VALUE
int.class.isAssignableFrom(): false
Integer.class.isAssignableFrom(): true
long.class.isAssignableFrom(): false
Long.class.isAssignableFrom(): false

Test Long.MAX_VALUE
int.class.isAssignableFrom(): false
Integer.class.isAssignableFrom(): false
long.class.isAssignableFrom(): false
Long.class.isAssignableFrom(): true
從上面的測試結果來看,可能是因為透過了 check (Object obj) 的轉換,編譯器或許直接把 primitive type 轉成對應的 Object type 了
因此在 main() 中宣告的 int 進入 check(Object obj) 後,輸出是 Integer 型態而非 int 型態
同時這個測試也能看出,雖然在 primitive type 中,int 的數值是可以指派給 long 變數,但轉型成 Object type 時,Integer 就不能指派給 Long 了。

附註:
本來這個測試是想驗證兩個問題,一個就是上面講到的,對 int 檢查 Long.class.isAssignableFrom() 是否會通過
另一個則是能不能直接對 primitive type 檢查是否為 primitive type。
從 [2] 的描述看起來,似乎是可以檢查 primitive type,但我想嘗試時卻不知道該怎麼樣寫才會通過編譯
如果有人知道的話,還請提供一點提示!m(_ _)m

參考資料:
  1. java: Class.isInstance vs Class.isAssignableFrom
  2. What is the difference between instanceof and Class.isAssignableFrom(…)?

沒有留言: