Izin clazzbazı olmak Classve objbazı olmak Object.
Dır-dir
clazz.isAssignableFrom(obj.getClass())
her zaman aynı
clazz.isInstance(obj)
?
Değilse, farklılıklar nelerdir?
NullPointerExceptionif atar obj == null.
Izin clazzbazı olmak Classve objbazı olmak Object.
Dır-dir
clazz.isAssignableFrom(obj.getClass())
her zaman aynı
clazz.isInstance(obj)
?
Değilse, farklılıklar nelerdir?
NullPointerExceptionif atar obj == null.
Yanıtlar:
clazz.isAssignableFrom(Foo.class)clazznesnenin temsil ettiği sınıfın bir üst sınıfı veya üst yüzeyi olduğunda doğru olacaktır Foo.
clazz.isInstance(obj)nesne objsınıfın bir örneği olduğunda doğru olur clazz.
Yani:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
bu kadar uzun her zaman olduğu gibi doğrudur clazzve objnonnull bulunmaktadır.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> arayüzler için de geçerlidir.
objbir nullsonra clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)bir atacağım NullPointerExceptionve döndürmez true.
Her iki cevap da ballparkta ama ikisi de tam bir cevap değil.
MyClass.class.isInstance(obj)bir örneği kontrol etmek içindir. Obj parametresi null olmadığında ve MyClassa olmadan yükseltilebildiğinde true değerini döndürür ClassCastException. Başka bir deyişle obj, MyClassalt sınıflarının bir örneğidir .
MyClass.class.isAssignableFrom(Other.class)MyClass, ile aynı veya üst sınıf veya üst yüzey ise , true değerini döndürür Other. Otherbir sınıf veya arayüz olabilir. A Otherdönüştürülebilirse doğru yanıt verir MyClass.
Göstermek için küçük bir kod:
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)? Ben çıktı ile karıştı :)
isAssignableFrom()a atar NullPointerException, oysa isInstance()sadece false döndürür. Gerçek cevap bu.
Bence bu ikisinin sonucu hep aynı olmalı. Fark, kullanmak için sınıfın bir örneğine, isInstanceyalnızca kullanılacak Classnesneye ihtiyacınız olmasıdır isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == trueama Byte.class.isInstance(Comparable.class) == false. Başka bir deyişle, isInstance()arayüzler için simetrik değil, sadece alt sınıflar için.
Byte.class.isInstance(Comparable.class)bir Classnesne örneği olmadığından yanlıştır Byte. Doğru karşılaştırma Comparable.class.isAssignableFrom(Byte.class)DİR Comparable.class.isInstance((byte) 1)doğrudur.
Byteonu genişletir Numberve bir sınıftır. (byte) 1ile eşdeğer değil Byte. Birincisi ilkel. İkincisi bir Sınıftır.
byteiçin Bytebir parametre tipi için isInstanceolan Object.
Kısacası, bu iki API'yı aşağıdaki gibi anlayabiliriz:
X.class.isAssignableFrom(Y.class)Eğer Xve Yaynı sınıf, ya da Xolduğu Y'ın süper sınıf veya süper arayüzü, gerçek, aksi takdirde false döndürür.
X.class.isInstance(y)Say ysınıfının bir örneğidir Yise, Xve Yaynı sınıf, ya da Xolduğu Y, aksi takdirde yanlış 'ın süper sınıf veya süper arayüzü, gerçek dönün.