2010-07-28 42 views
5

Eclipse được nói "HashMap là một loại nguyên liệu" Khi tôi sử dụng đoạn mã sauEclipse Cảnh báo với Java HashMap

HashMap = new HashMap(); 

Bất kỳ ý tưởng những gì có thể xảy ra?

+2

Thử một cái gì đó như: HashMap h = new HashMap (); Như những người khác đã đề cập, bạn không chỉ định loại cho khóa và giá trị. Sẽ an toàn hơn khi cung cấp thông tin này để kiểm tra loại. –

+1

@James Hoặc tốt hơn 'Bản đồ cuối cùng h = new HashMap ();'. –

+0

@Tom Hawtin - Đúng, sử dụng Bản đồ sẽ tốt hơn, nhưng tôi chỉ đang làm theo ví dụ của anh ấy. :) –

Trả lời

17

Eclipse sẽ cung cấp cho bạn cảnh báo đó khi bạn sử dụng một số không GenericHashMap sử dụng Java 5 trở lên.

Xem thêm: Generics Lesson trong Hướng dẫn Java của Sun.

Chỉnh sửa: Thực ra, ở đây, tôi sẽ đưa ra một ví dụ quá:

Nói rằng tôi muốn để ánh xạ tên của ai đó để Person đối tượng của họ:

Map<String, Person> map = new HashMap<String, Person>(); 
// The map.get method now returns a Person 
// The map.put method now requires a String and a Person 

Đây là những kiểm tra tại thời gian biên dịch; thông tin kiểu bị mất vào thời gian chạy do Java thực hiện Generics như thế nào.

+1

map.get() vẫn lấy một đối tượng.Nó có vẻ đáng ngạc nhiên (kiểm tra javadoc nếu bạn không tin tôi), nhưng Josh Bloch đã bình luận về điều này một lần, nói rằng nếu họ đã thay đổi chữ ký để có được (K key) họ có thể gây ra lỗi cho mã đó, trên thực tế , chính xác. – waxwing

+0

@waxwing: Thú vị. Tôi nên nhận thấy rằng khi tôi nhìn vào các trang Map/HashMap. Tôi sẽ sửa nó. Oh, tôi cũng quên đề cập đến bây giờ trả về một đối tượng 'Person'. Rất tiếc. – Powerlord

+0

@R. Bemrose: về mặt kỹ thuật, 'get' vẫn trả về' Object', nhưng các generics cho trình biên dịch thêm một diễn viên vào 'Person'. –

1

Thiếu thông tin tổng quát, tức là. Nếu bạn không biết điều này thì hãy đặt trình biên dịch eclipse thành java 1.4

3

Không có gì sai chính xác, nhưng bạn đang bỏ lỡ thế giới tuyệt vời của Generics. Tùy thuộc vào những hạn chế bạn muốn đặt vào các loại được sử dụng trong bản đồ của bạn, bạn nên thêm các tham số kiểu. Ví dụ:

Map<String, Integer> map = new HashMap<String, Integer>(); 
0

Điều đó thường có nghĩa là bạn đang trộn mã chung với mã không chung chung.

Nhưng như ví dụ của bạn sẽ không còn biên dịch của nó chứ không phải khó có thể nói ....

1

Hãy thử

HashMap<String,Integer> map = new HashMap<String,Integer>(); 

thay vì (rõ ràng là thay thế các loại chìa khóa (String) và kiểu giá trị (Integer)).

0

Thiếu loại chung. Bạn nên chỉ định cặp chung-giá trị chung cho bản đồ của mình. Ví dụ, sau đây là một tuyên bố rằng instantiates một HashMap với chuỗi loại khóa và giá trị kiểu Integer.

Map<String, Integer> map = new HashMap<String, Integer>(); 
0

Tất cả những câu trả lời hợp lệ này, bạn cũng có thể sử dụng chú thích @SurpressWarnings để có được kết quả tương tự, mà không phải sử dụng các loại thuốc generic thực tế. ;)

0

hashmap là một loại nguyên liệu và do đó nên được parameterised tức gì bao giờ dữ liệu chúng tôi có được thông qua chức năng haspmap loại của họ phải được khai báo để nhận chức năng của mình

ví dụ

HashMap<String, Integer> map = new HashMap<String, Integer>(); 
Các vấn đề liên quan