Ini muncul sebagai pertanyaan yang saya ajukan dalam sebuah wawancara baru-baru ini karena kandidat ingin melihat ditambahkan ke bahasa Jawa. Ini biasanya diidentifikasi sebagai masalah bahwa Java tidak memiliki obat generik , tetapi ketika didorong, kandidat tidak dapat benar-benar memberi tahu saya hal-hal yang dapat dia capai jika mereka ada di sana.
Jelas karena tipe mentah diperbolehkan di Java (dan pemeriksaan tidak aman), adalah mungkin untuk menumbangkan obat generik dan berakhir dengan List<Integer>
yang (misalnya) sebenarnya berisi String
s. Ini jelas bisa dibuat mustahil jika informasi jenis direifikasi; tapi pasti ada lebih dari ini !
Dapatkah orang memposting contoh hal-hal yang benar-benar ingin mereka lakukan , apakah obat generik reified tersedia? Maksud saya, jelas Anda bisa mendapatkan tipe a List
saat runtime - tetapi apa yang akan Anda lakukan dengannya?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDIT : Pembaruan cepat untuk ini karena jawabannya tampaknya terutama berkaitan dengan kebutuhan untuk memasukkan a Class
sebagai parameter (misalnya EnumSet.noneOf(TimeUnit.class)
). Saya mencari lebih banyak hal di sepanjang garis di mana hal ini tidak mungkin . Sebagai contoh:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
harus mengabaikan parameterisasi, tetapi defineClass()
tidak bisa). Dan seperti yang kita ketahui, The Powers That Be memegang sangat penting kompatibilitas.