instanceof
判斷某個對象是否是某個類的實例或者某個類的子類的實例。它的判斷方式大概是這樣的:
public<T> boolean function(Object obj, Class<T> calzz) {
if (obj == null) {
return false;
}
try {
T t = (T) obj;
return true;
} catch (ClassCastException e) {
return false;
}
}
Class.equals()
這種方式比較的類型,一定是本身才返回true,子類或者父類都返回false;
// B是A的子類,C是B的子類
B b = new B();
// false
System.out.println(b.getClass().equals(A.class));
// true
System.out.println(b.getClass().equals(B.class));
// false
System.out.println(b.getClass().equals(C.class));
PS:b.getClass().equals(A.class)等同於b.getClass() == A.class
Class.isInstance()
這個方法跟instanceof完全等價。
// B是A的子類,C是B的子類
B b = new B();
// true
System.out.println(A.class.isInstance(b));
// true
System.out.println(B.class.isInstance(b));
// false
System.out.println(C.class.isInstance(b));
Class.isAssignableFrom
判斷某個類是否是另一個類和其子類。
// B是A的子類,C是B的子類
// false
System.out.println(B.class.isAssignableFrom(A.class));
// true
System.out.println(B.class.isAssignableFrom(B.class));
// true
System.out.println(B.class.isAssignableFrom(C.class));