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:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
Kemudian Anda dapat menggunakan isAssignableFrom untuk memeriksa jenisnya.
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
Setiap kali Anda membuat instance objek, Anda harus mengulang sendiri:
new MyCollection<Apples>(Apples.class);
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:
protected abstract void abstractMethod(T element);
Anda bisa menggunakannya seperti ini:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
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.
Class.isAssignableFrom
.