Pozwól clazzbyć trochę Classi objbądź trochę Object.
Jest
clazz.isAssignableFrom(obj.getClass())
zawsze taki sam jak
clazz.isInstance(obj)
?
Jeśli nie, jakie są różnice?
NullPointerExceptionif obj == null.
Pozwól clazzbyć trochę Classi objbądź trochę Object.
Jest
clazz.isAssignableFrom(obj.getClass())
zawsze taki sam jak
clazz.isInstance(obj)
?
Jeśli nie, jakie są różnice?
NullPointerExceptionif obj == null.
Odpowiedzi:
clazz.isAssignableFrom(Foo.class)będzie prawdą, ilekroć klasa reprezentowana przez clazzobiekt jest nadklasą lub superinterface Foo.
clazz.isInstance(obj)będzie prawdziwe, ilekroć obiekt objjest instancją klasy clazz.
To jest:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
zawsze jest prawdą tak długo, jak długo clazzi objsą niepustych.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> dotyczy to również interfejsów.
objtak, nullto clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)rzuci NullPointerExceptiona nie wróci true.
Obie odpowiedzi są na boisku, ale żadna nie jest kompletną odpowiedzią.
MyClass.class.isInstance(obj)służy do sprawdzania instancji. Zwraca true, gdy parametr obj ma wartość MyClassinną niż null i można do niego rzutować bez podnoszenia a ClassCastException. Innymi słowy, obj jest instancją MyClasslub jej podklasami.
MyClass.class.isAssignableFrom(Other.class)zwróci true, jeśli MyClassjest taka sama jak, albo nadrzędnej lub superinterface z, Other. Othermoże być klasą lub interfejsem. To prawda, jeśli Othermożna je przekonwertować na MyClass.
Mały kod do zademonstrowania:
public class NewMain
{
public static void main(String[] args)
{
NewMain nm = new NewMain();
nm.doit();
}
class A { }
class B extends A { }
public void doit()
{
A myA = new A();
B myB = new B();
A[] aArr = new A[0];
B[] bArr = new B[0];
System.out.println("b instanceof a: " + (myB instanceof A)); // true
System.out.println("b isInstance a: " + A.class.isInstance(myB)); //true
System.out.println("a isInstance b: " + B.class.isInstance(myA)); //false
System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class)); //true
System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class)); //false
System.out.println("bArr isInstance A: " + A.class.isInstance(bArr)); //false
System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr)); //true
System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass())); //true
}
}
A.class.isAssignableFrom(B.class)? Myliłem przez wynik :)
isAssignableFrom()wyrzuca a, NullPointerExceptionjeśli obiekt ma wartość null, a isInstance()po prostu zwraca false. To jest prawdziwa odpowiedź.
Myślę, że wynik dla tych dwóch powinien zawsze być taki sam. Różnica polega na tym, że potrzebujesz instancji klasy do użycia, isInstanceale tylko Classobiektu do użycia isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == trueale Byte.class.isInstance(Comparable.class) == false. Innymi słowy, isInstance()nie jest symetryczny dla interfejsów, tylko dla podklas.
Byte.class.isInstance(Comparable.class)jest fałszem, ponieważ Classobiekt nie jest instancją Byte. Prawidłowe porównanie Comparable.class.isAssignableFrom(Byte.class)to Comparable.class.isInstance((byte) 1), co jest prawdą.
Byte, odkryje, że rozszerza się Numberi jest klasą. (byte) 1nie jest równoważne z Byte. Ten pierwszy jest prymitywny. Ten ostatni jest klasą.
bytena, Byteponieważ typ parametru isInstanceto Object.
Dla zwięzłości możemy zrozumieć te dwa interfejsy API, takie jak poniżej:
X.class.isAssignableFrom(Y.class)Jeśli Xi Ysą tą samą klasą lub Xsą Ysuperklasą lub super interfejsem, zwróć true, w przeciwnym razie false.
X.class.isInstance(y)Powiedz, że yjest instancją klasy Y, jeśli Xi Ysą tą samą klasą, lub Xjest Ysuperklasą lub super interfejsem, zwróć true, w przeciwnym razie false.