Chà, trước hết, bạn đang lãng phí bộ nhớ với HashMap
cuộc gọi tạo mới . Dòng thứ hai của bạn hoàn toàn bỏ qua tham chiếu đến hàm băm được tạo này, sau đó nó có sẵn cho trình thu gom rác. Vì vậy, đừng làm điều đó, sử dụng:
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
Thứ hai, trình biên dịch đang phàn nàn rằng bạn truyền đối tượng đến a HashMap
mà không kiểm tra xem nó có phải là a không HashMap
. Nhưng, ngay cả khi bạn đã làm:
if(getApplicationContext().getBean("someMap") instanceof HashMap) {
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
}
Bạn có thể vẫn sẽ nhận được cảnh báo này. Vấn đề là, getBean
trả về Object
, vì vậy không biết loại này là gì. Chuyển đổi nó thành HashMap
trực tiếp sẽ không gây ra vấn đề với trường hợp thứ hai (và có lẽ sẽ không có cảnh báo nào trong trường hợp đầu tiên, tôi không chắc trình biên dịch Java có phạm vi như thế nào với các cảnh báo cho Java 5). Tuy nhiên, bạn đang chuyển đổi nó thành a HashMap<String, String>
.
HashMaps thực sự là các bản đồ lấy một đối tượng làm khóa và có một đối tượng làm giá trị, HashMap<Object, Object>
nếu bạn muốn. Vì vậy, không có gì đảm bảo rằng khi bạn nhận được bean của mình thì nó có thể được biểu diễn là HashMap<String, String>
vì bạn có thể có HashMap<Date, Calendar>
vì đại diện không chung chung được trả về có thể có bất kỳ đối tượng nào.
Nếu mã biên dịch và bạn có thể thực thi String value = map.get("thisString");
mà không có bất kỳ lỗi nào, đừng lo lắng về cảnh báo này. Nhưng nếu bản đồ không hoàn toàn từ các khóa chuỗi thành các giá trị chuỗi, bạn sẽ nhận được một ClassCastException
thời gian chạy, vì các tổng quát không thể ngăn điều này xảy ra trong trường hợp này.