Biarkan clazzbeberapa Classdan objbeberapa Object.
Adalah
clazz.isAssignableFrom(obj.getClass())
selalu sama dengan
clazz.isInstance(obj)
?
Jika tidak, apa perbedaannya?
NullPointerExceptionif obj == null.
Biarkan clazzbeberapa Classdan objbeberapa Object.
Adalah
clazz.isAssignableFrom(obj.getClass())
selalu sama dengan
clazz.isInstance(obj)
?
Jika tidak, apa perbedaannya?
NullPointerExceptionif obj == null.
Jawaban:
clazz.isAssignableFrom(Foo.class)akan benar setiap kali kelas yang diwakili oleh clazzobjek adalah superclass atau superinterface dari Foo.
clazz.isInstance(obj)akan benar setiap kali objek objadalah turunan dari kelas clazz.
Itu adalah:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
selalu benar selama clazzdan objtidak kosong.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> itu benar juga untuk antarmuka.
objadalah nullmaka clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)akan melempar NullPointerExceptiondan tidak kembali true.
Kedua jawaban ada di stadion baseball tetapi tidak ada jawaban yang lengkap.
MyClass.class.isInstance(obj)adalah untuk memeriksa sebuah instance. Ini mengembalikan true ketika parameter obj non-null dan dapat dilemparkan ke MyClasstanpa menaikkan a ClassCastException. Dengan kata lain, obj adalah turunan dari MyClassatau subkelasnya.
MyClass.class.isAssignableFrom(Other.class)akan mengembalikan true jika MyClasssama dengan, atau superclass atau superinterface dari Other,. Otherbisa berupa kelas atau antarmuka. Itu menjawab benar jika Otherdapat dikonversi ke a MyClass.
Sedikit kode untuk diperagakan:
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)? Saya bingung dengan output :)
isAssignableFrom()melempar a NullPointerExceptionjika objek tersebut null, sedangkan isInstance()hanya mengembalikan false. Itu jawaban yang sebenarnya.
Saya pikir hasilnya untuk keduanya harus selalu sama. Perbedaannya adalah bahwa Anda memerlukan instance kelas untuk digunakan isInstancetetapi hanya Classobjek yang akan digunakan isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == truetapi Byte.class.isInstance(Comparable.class) == false. Dengan kata lain, isInstance()tidak simetris untuk antarmuka, hanya untuk subkelas.
Byte.class.isInstance(Comparable.class)salah karena Classobjek bukan turunan dari Byte. Perbandingan yang benar Comparable.class.isAssignableFrom(Byte.class)adalah Comparable.class.isInstance((byte) 1), yang benar.
ByteAnda akan menemukan itu meluas Numberdan kelas. (byte) 1tidak setara dengan Byte. Yang pertama adalah primitif. Yang terakhir adalah Kelas.
byteke Bytekarena jenis parameter isInstanceadalah Object.
Untuk singkatnya, kita dapat memahami dua API ini seperti di bawah ini:
X.class.isAssignableFrom(Y.class)Jika Xdan Yadalah kelas yang sama, atau Xmerupakan Y's kelas super atau super antarmuka, kembali benar, jika tidak, palsu.
X.class.isInstance(y)Say yadalah turunan dari kelas Y, jika Xdan Yadalah kelas yang sama, atau Xadalah Ykelas super atau antarmuka super, mengembalikan true, jika tidak, false.