Pertama-tama, Anda membuang-buang memori dengan HashMap
panggilan kreasi baru . Baris kedua Anda sama sekali mengabaikan referensi untuk hashmap yang dibuat ini, membuatnya kemudian tersedia untuk pengumpul sampah. Jadi, jangan lakukan itu, gunakan:
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
Kedua, kompiler mengeluh bahwa Anda melemparkan objek ke a HashMap
tanpa memeriksa apakah itu a HashMap
. Tetapi, bahkan jika Anda melakukannya:
if(getApplicationContext().getBean("someMap") instanceof HashMap) {
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
}
Anda mungkin masih mendapatkan peringatan ini. Masalahnya adalah, getBean
pengembalian Object
, jadi tidak diketahui apa jenisnya. Mengubahnya secara HashMap
langsung tidak akan menyebabkan masalah dengan kasus kedua (dan mungkin tidak akan ada peringatan dalam kasus pertama, saya tidak yakin seberapa hebatnya kompiler Java dengan peringatan untuk Java 5). Namun, Anda mengubahnya menjadi a HashMap<String, String>
.
HashMaps benar-benar peta yang mengambil objek sebagai kunci dan memiliki objek sebagai nilai, HashMap<Object, Object>
jika Anda mau. Dengan demikian, tidak ada jaminan bahwa ketika Anda mendapatkan kacang Anda itu dapat direpresentasikan sebagai HashMap<String, String>
karena Anda dapat memiliki HashMap<Date, Calendar>
karena representasi non-generik yang dikembalikan dapat memiliki objek apa pun.
Jika kode dikompilasi, dan Anda dapat mengeksekusi String value = map.get("thisString");
tanpa kesalahan, jangan khawatir tentang peringatan ini. Tetapi jika peta tidak sepenuhnya dari kunci string ke nilai string, Anda akan mendapatkan ClassCastException
saat runtime, karena obat generik tidak dapat memblokir ini terjadi dalam kasus ini.