2013-10-29 85 views
5

給定一個Class<?> superTypeObject subInstance,什麼是類#isInstance VS級#isAssignableFrom

superType.isInstance(subInstance) 

superType.isAssignableFrom(subInstance.getClass()) 

(如果有的話)之間的區別是什麼?每當由類對象所表示的類是subInstance.getClass()

isInstance()一個超類或超每當對象subInstancesuperType實例將爲真

+0

查看java源代碼 –

+3

@Sunny這兩種方法都是本地的。 –

+0

哎呀!沒有想過它 –

回答

2

isAssignableFrom還測試該類型是否可以通過標識轉換或通過擴展參考轉換進行轉換。

Class<?> cInt = Integer.TYPE; 

    Long l = new Long(123); 

    System.out.println(cInt.isInstance(l)); // false 
    System.out.println(cInt.isAssignableFrom(cInt)); // true 
+1

沒有什麼 - 'cInt.isAssignableFrom(cInt)'當然是真的,因爲它正在測試自己。這不是與'cInt'的比較。isInstance(l)',因爲'l'是一個Long,而不是'Integer.TYPE'。 – Nicole

0

isAssignableFrom()將爲真。

所以基本區別在於isInstance適用於實例isAssignableFrom適用於類。如果我沒有實例/不想實例化類,我經常使用isAssignableFrom。否則,你可以使用兩者。

1

在這種情況下,沒有區別。

兩種方法之間的區別是參數。一個可與對象和一個與類:

Class#isInstance(Object)

確定指定對象是分配兼容此Class表示的對象 。

Class#isAssignableFrom(Class)

判定此 Class對象所表示的類或接口或者是相同,或是一個超類或 超接口的,由指定 類表示的類或接口參數。

0

Java API

isInstance(Object obj) 
Determines if the specified Object is assignment-compatible with the object represented by this Class. 

isAssignableFrom(Class<?> cls) 
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter. 

所以,它聽起來就像兩種方法做的非常類似的事情,而是一個需要一個Object,並期待在該對象的Class,而另一個需要Class