Bagaimana saya bisa melihat di Java jika Object adalah array tanpa menggunakan refleksi? Dan bagaimana saya bisa mengulang semua item tanpa menggunakan refleksi?
Saya menggunakan Google GWT jadi saya tidak diizinkan menggunakan refleksi :(
Saya ingin menerapkan metode berikut tanpa menggunakan refelection:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
BTW: saya juga tidak ingin menggunakan JavaScript sehingga saya dapat menggunakannya di lingkungan non-GWT.
java
arrays
gwt
instanceof
edbras
sumber
sumber
obj.getClass().getComponentType()
.Anda bisa menggunakan
instanceof
.JLS 15.20.2 Operator Pembanding Jenis
instanceof
Artinya, Anda dapat melakukan sesuatu seperti ini:
Anda harus memeriksa apakah objek adalah
instanceof boolean[]
,byte[]
,short[]
,char[]
,int[]
,long[]
,float[]
,double[]
, atauObject[]
, jika Anda ingin mendeteksi semua jenis larik.Juga, an
int[][]
adalah aninstanceof Object[]
, jadi tergantung bagaimana Anda ingin menangani array bersarang, ini bisa menjadi rumit.Untuk
toString
,java.util.Arrays
memilikitoString(int[])
dan kelebihan lainnya yang dapat Anda gunakan. Ini juga memilikideepToString(Object[])
untuk array bersarang.Ini akan menjadi sangat berulang (tetapi bahkan
java.util.Arrays
sangat berulang ), tapi begitulah di Java dengan array.Lihat juga
sumber
java.util.Arrays
, ya. Saya melihat bahwa Anda telah membaca kode yang saya tautkan.Seseorang dapat mengakses setiap elemen array secara terpisah menggunakan kode berikut:
Perhatikan bahwa tidak perlu untuk mengetahui jenis array yang mendasarinya, karena ini akan berfungsi untuk semua array.
sumber
isArray()
sudah cukup tercakup dalam jawaban yang diposting 4 tahun sebelumnya.Tidak ada hubungan subtipe antara array tipe primitif, atau antara array tipe primitif dan array tipe referensi. Lihat JLS 4.10.3 .
Oleh karena itu, berikut ini salah sebagai pengujian untuk melihat apakah
obj
ada array jenis apa pun :Secara khusus, itu tidak berfungsi jika
obj
array 1-D primitif. (Ini berfungsi untuk larik primitif dengan dimensi yang lebih tinggi, karena semua jenis larik adalah subtipe dariObject
. Tetapi dalam kasus ini hal ini diperdebatkan.)Solusi terbaik (untuk bagian
isArray
larik pertanyaan) bergantung pada apa yang dihitung sebagai "menggunakan refleksi".Di GWT, menelepon
obj.getClass().isArray()
tidak dihitung menggunakan refleksi 1 , jadi itu adalah solusi terbaik.Jika tidak, cara terbaik untuk mengetahui apakah suatu objek memiliki tipe array adalah dengan menggunakan urutan
instanceof
ekspresi.Anda juga dapat mencoba bermain-main dengan nama kelas objek sebagai berikut, tetapi panggilan ke
obj.getClass()
berbatasan dengan refleksi.1 - Lebih tepatnya,
Class.isArray
metode ini terdaftar seperti yang didukung oleh GWT di halaman ini .sumber
Anda dapat membuat kelas utilitas untuk memeriksa apakah kelas tersebut mewakili Koleksi , Peta , atau Larik
sumber
Cukup
obj instanceof Object[]
(diuji di JShell).sumber