2009-09-21 28 views
9

Trong Java, giao diện Bản đồ được định nghĩa là,Java Generics: Tại sao Map.get() bỏ qua loại?

public interface Map<K,V> { 
    ... 
    V get(Object key); 
    ... 
} 

Tại sao không?

V get(K key); 

Tôi vừa gặp phải lỗi khó chịu vì khóa loại sai được sử dụng. Tôi nghĩ mục đích của generics là bắt lỗi loại sớm trong quá trình biên dịch. Điều này có đánh bại mục đích đó không?

+0

Một số câu trả lời hay có thể tìm thấy ở đây: [Lý do gì Map.get (khóa đối tượng) không phải là (đầy đủ) chung] http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic) – NickDK

Trả lời

9

Kevin Bourrillion blogged about this cách đây không lâu. Tóm tắt:

Thống nhất, phương pháp của Bộ sưu tập Java Framework (và Google Bộ sưu tập Thư viện quá) không bao giờ hạn chế các loại thông số của họ trừ khi đó là cần thiết để ngăn chặn bộ sưu tập khỏi bị phá vỡ.

Cá nhân tôi không phải là người hâm mộ của cách tiếp cận đó, nhưng nó có ý nghĩa nào đó theo cách tiếp cận phương sai cũng đã được thực hiện.

-3

Để thêm vào @subtenante, Java được thiết kế sao cho Java sẽ luôn tương thích ngược. Generics không cho phép đặt sai loại, vì điều này không phá vỡ khả năng tương thích ngược. Cách dễ dàng để đảm bảo rằng phím bên phải đang được sử dụng là thực hiện điều này.

K key = null; 
V value = null; 

Map<K,V> mapped = new HashMap<K,V>() 
.......//set the key and value.......... 
mapped.put(key, value) 
..... 
V var = mapped.get(key); 

Sự cố được giải quyết.
Một cảnh báo trước nữa về generics, bất kỳ đứa trẻ nào của một lớp cũng có thể được đặt vào một bộ sưu tập.

Number k= null; 
Number v= null; 

Map<Number,Number> mapped = new HashMap<Number,Number>() 
.......//set the key and value.......... 
k = double someDouble; 
v = int someInt; 
mapped.put(k, v) 
..... 

Điều này có thể gây ra một số lỗi lớn !!

+0

Tôi thực sự không thấy nơi xóa bỏ đi vào điều này. Erasure chỉ nên là một vấn đề nếu bạn đang làm một cái gì đó "không an toàn". –

+0

Đặt() sử dụng các loại generics. Tôi chỉ phàn nàn về việc có được. –

+0

@ZZ Coder, tôi đã giải quyết vấn đề nhận được trong tập hợp mã hàng đầu, bộ mã thứ hai tôi đã chỉ ra một vấn đề phổ biến khác mà một số người đã sử dụng Generics – WolfmanDragon

3

đối tượng của một loại có thể là .equals() đối với một đối tượng thuộc loại khác. get() chỉ yêu cầu đối tượng mà bạn cung cấp cho nó là .equals() cho khóa mà bạn đang nhận được

+0

Điều này không đúng. Tôi nhận được ClassCastException để loại phải khớp. –

+7

Nếu bạn nhận được một ClassCastException thì bằng() được triển khai kém. Đó là một ý tưởng tốt hơn để trả về false nếu các loại không tương thích. – finnw

Các vấn đề liên quan