不過在對於 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
參考資料:
沒有留言:
張貼留言