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