Izin clazz
bazı olmak Class
ve obj
bazı olmak Object
.
Dır-dir
clazz.isAssignableFrom(obj.getClass())
her zaman aynı
clazz.isInstance(obj)
?
Değilse, farklılıklar nelerdir?
NullPointerException
if atar obj == null
.
Izin clazz
bazı olmak Class
ve obj
bazı olmak Object
.
Dır-dir
clazz.isAssignableFrom(obj.getClass())
her zaman aynı
clazz.isInstance(obj)
?
Değilse, farklılıklar nelerdir?
NullPointerException
if atar obj == null
.
Yanıtlar:
clazz.isAssignableFrom(Foo.class)
clazz
nesnenin 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 obj
sı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 clazz
ve obj
nonnull bulunmaktadır.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b));
-> arayüzler için de geçerlidir.
obj
bir null
sonra clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
bir atacağım NullPointerException
ve 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 MyClass
a olmadan yükseltilebildiğinde true değerini döndürür ClassCastException
. Başka bir deyişle obj, MyClass
alt 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
. Other
bir sınıf veya arayüz olabilir. A Other
dö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, isInstance
yalnızca kullanılacak Class
nesneye ihtiyacınız olmasıdır isAssignableFrom
.
Comparable.class.isAssignableFrom(Byte.class) == true
ama 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 Class
nesne ö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.
Byte
onu genişletir Number
ve bir sınıftır. (byte) 1
ile eşdeğer değil Byte
. Birincisi ilkel. İkincisi bir Sınıftır.
byte
için Byte
bir parametre tipi için isInstance
olan Object
.
Kısacası, bu iki API'yı aşağıdaki gibi anlayabiliriz:
X.class.isAssignableFrom(Y.class)
Eğer X
ve Y
aynı sınıf, ya da X
olduğ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 y
sınıfının bir örneğidir Y
ise, X
ve Y
aynı sınıf, ya da X
olduğu Y
, aksi takdirde yanlış 'ın süper sınıf veya süper arayüzü, gerçek dönün.