Saya ingin memeriksa apakah suatu objek o
adalah turunan dari kelas C
atau subkelas dari C
.
Misalnya, jika p
adalah kelas Point
saya ingin x.instanceOf(Point.class)
menjadi true
dan juga x.instanceOf(Object.class)
untuk menjadi true
.
Saya ingin itu bekerja juga untuk tipe primitif berkotak. Misalnya, jika x
adalah Integer
maka x.instanceOf(Integer.class)
seharusnya true
.
Apa ada yang seperti itu? Jika tidak, bagaimana cara menerapkan metode seperti itu?
java
reflection
instanceof
snakile
sumber
sumber
Jawaban:
Class.isInstance melakukan apa yang Anda inginkan.
if (Point.class.isInstance(someObj)){ ... }
Tentu saja, Anda tidak boleh menggunakannya jika Anda bisa menggunakannya
instanceof
, tetapi untuk skenario refleksi sering kali berguna.sumber
if (a instanceof Point)
- tetapi Anda melakukannya dengan cara yang lebih berbelit-belit, siapa pun yang membaca kode pasti akan berpikir "oh, pasti ada alasan untuk hal ini dilakukan dengan cara yang sulit", dan lalu buka dokumen untuk mengetahuiClass.isInstance
perbedaannya dariinstanceof
. Anda membuang waktu rekan kerja Anda.Um ... Apa? Apakah o, p dan x itu?
Tidak. Seharusnya tidak dikompilasi. Primitif bukanlah objek, dan Anda tidak dapat memanggil metode padanya.
Bagaimanapun, ada tiga hal, salah satunya pasti dapat mencapai apa yang Anda inginkan (mereka agak berbeda di mana tepatnya diterapkan:
instanceof
Operator jika Anda tahu kelas pada waktu kompilasi.sumber
x instanceof Integer x instanceof Object
Anda hanya perlu menggunakan sintaks yang benar
untuk tipe primitif, Anda harus melakukannya dengan sangat berbeda. Karena Anda tidak dapat membuat metode untuk mereka, Anda memerlukan kelas yang menyimpan metode tersebut. Jadi, alih-alih "x.instanceOf (Integer.Class)", Anda harus memanggil "MyClassComparer.instanceOf (x, Integer.Class)" atau sesuatu seperti itu. Ini dapat dengan mudah diimplementasikan dengan metode overloading, tetapi saya gagal melihat kasus ketika fungsionalitas itu diinginkan sama sekali.
sumber
Sebenarnya di Java ada operator boolean yang disebut instanceof yang dapat digunakan untuk menentukan apakah suatu objek adalah turunan kelas, turunan subkelas, atau turunan kelas yang mengimplementasikan antarmuka tertentu.
if(obj instanceof SomeClass) { // Do something }
Tutorial Java memiliki contoh yang bagus untuk operator ini
sumber
Anda dapat melakukan:
if (foo instanceof classNameYouWantToCheck)
sumber
"Saya ingin itu bekerja juga untuk tipe primitif. Misalnya, jika x adalah integer maka x.instanceOf (Integer.class) dan juga x.instanceOf (Object.class) harus benar."
Mengapa? Tipe primitif dan tipe referensi benar-benar terpisah. Int primitif bukanlah subtipe dari Integer atau Object. Jenis nilai primitif selalu diketahui secara statis pada waktu kompilasi, jadi tidak ada gunanya menguji jenisnya. Tentu, Anda dapat mengemas nilai primitif dan kemudian menguji tipenya:
(Integer)5 instanceof Integer
Tapi apa gunanya?
sumber
Saya pikir Anda bingung tentang instanceof untuk benda mentah dan yang umum
obj instanceof Class obj instanceof Class<?> // this is the one you want
sumber
instanceof
.