Sebelum saya melihat melalui struktur data generik saya untuk indeks nilai, saya ingin melihat apakah ini adalah contoh dari jenis yang this
telah ditentukan.
Tapi Eclipse mengeluh ketika saya melakukan ini:
@Override
public int indexOf(Object arg0) {
if (!(arg0 instanceof E)) {
return -1;
}
Ini adalah pesan kesalahan:
Tidak dapat melakukan instanceof terhadap parameter tipe E. Sebagai gantinya gunakan Objek penghapusan karena informasi tipe umum akan terhapus saat runtime
Apa cara yang lebih baik untuk melakukannya?
java
generics
instanceof
typechecking
Nick Heiner
sumber
sumber
Class.isAssignableFrom
.Dua opsi untuk pengecekan tipe runtime dengan obat generik:
Opsi 1 - Rusak konstruktor Anda
Mari kita asumsikan Anda mengganti indexOf (...), dan Anda ingin memeriksa tipe hanya untuk kinerja, untuk menyelamatkan diri Anda sendiri iterasi seluruh koleksi.
Buat konstruktor kotor seperti ini:
Kemudian Anda dapat menggunakan isAssignableFrom untuk memeriksa jenisnya.
Setiap kali Anda membuat instance objek, Anda harus mengulang sendiri:
Anda mungkin memutuskan itu tidak layak. Dalam implementasi ArrayList.indexOf (...) , mereka tidak memeriksa apakah jenisnya cocok.
Opsi 2 - Biarkan gagal
Jika Anda perlu menggunakan metode abstrak yang memerlukan jenis tidak dikenal Anda, maka semua yang Anda inginkan adalah agar kompiler berhenti menangis tentang instanceof . Jika Anda memiliki metode seperti ini:
Anda bisa menggunakannya seperti ini:
Anda melempar objek ke T (tipe generik Anda), hanya untuk menipu kompiler. Para pemain Anda tidak melakukan apa-apa saat runtime , tetapi Anda masih akan mendapatkan ClassCastException ketika Anda mencoba untuk memasukkan tipe objek yang salah ke dalam metode abstrak Anda.
CATATAN 1: Jika Anda melakukan gips yang tidak dicentang tambahan dalam metode abstrak Anda, ClassCastExceptions Anda akan terjebak di sini. Itu bisa baik atau buruk, jadi pikirkan baik-baik.
CATATAN 2: Anda mendapatkan cek nol gratis ketika Anda menggunakan instanceof . Karena Anda tidak dapat menggunakannya, Anda mungkin perlu memeriksa nol dengan tangan kosong.
sumber
Posting lama, tetapi cara sederhana untuk melakukan pengecekan instanceOf generik.
sumber
Asalkan kelas Anda memperluas kelas dengan parameter generik, Anda juga bisa mendapatkan ini saat runtime melalui refleksi, dan kemudian menggunakannya untuk perbandingan, yaitu
Dalam kasus di atas, pada saat runtime Anda akan mendapatkan String.class dari getParameterizedClass (), dan cache sehingga Anda tidak mendapatkan overhead refleksi setelah beberapa pemeriksaan. Perhatikan bahwa Anda bisa mendapatkan tipe parameter lain berdasarkan indeks dari metode ParameterizedType.getActualTypeArguments ().
sumber
Saya memiliki masalah yang sama dan inilah solusi saya (sangat rendah hati, @george: kali ini mengkompilasi DAN bekerja ...).
Masalah saya ada di dalam kelas abstrak yang mengimplementasikan Observer. Pembaruan metode kebakaran yang dapat diobservasi (...) dengan kelas Object yang dapat berupa segala jenis Object.
Saya hanya ingin menangani Objek tipe T
Solusinya adalah meneruskan kelas ke konstruktor agar dapat membandingkan tipe saat runtime.
Untuk implementasinya kita hanya perlu meneruskan Kelas ke konstruktor
sumber
Atau Anda bisa menangkap upaya gagal untuk melemparkan ke E eg.
sumber
Secara teknis Anda tidak harus melakukannya, itulah gunanya obat generik, sehingga Anda dapat melakukan pengecekan tipe kompilasi:
tetapi kemudian @Override mungkin menjadi masalah jika Anda memiliki hierarki kelas. Kalau tidak, lihat jawaban Yishai.
sumber
Tipe runtime objek adalah kondisi yang relatif arbitrer untuk difilter. Saya sarankan menjauhkan kesembronoan dari koleksi Anda. Ini hanya dicapai dengan meminta delegasi koleksi Anda ke filter melewati konstruksi.
sumber
Comparator
atau serupa.)