2010-01-04 36 views
34

Khi tôi cố gắng để khai báo một từ điển như vậy:Sử dụng int như một tham số kiểu cho java.util.Dictionary

private Dictionary<String, int> map; 

Trình biên dịch mang lại cho tôi những lỗi sau:

Syntax error on token "int", Dimensions expected after this token

Nhưng nó hoạt động tốt với Integer. Tôi mơ hồ nhận thức rằng Java xử lý int/Integer khác nhau (tôi đến từ nền .NET), nhưng tôi hy vọng ai đó có thể giải thích đầy đủ về lý do tại sao tôi không thể sử dụng nguyên thủy trong từ điển <>

+5

Từ javadoc của từ điển: ** LƯU Ý: ** Lớp này đã lỗi thời. Triển khai mới nên triển khai giao diện Bản đồ, thay vì mở rộng lớp này. – Esko

+1

Hãy ném câu trả lời đó và tôi sẽ +1 nó (một lần nữa) –

+1

Meh, tôi không thực sự quan tâm - bạn làm điều đó, tôi sẽ +1 bạn :) – Esko

Trả lời

40

Trong Java nguyên thủy không phải là đối tượng, vì vậy bạn không thể sử dụng chúng thay cho các đối tượng. Tuy nhiên Java sẽ tự động hộp/nguyên thủy Unbox (aka autoboxing) thành các đối tượng để bạn có thể làm những việc như:

List<Integer> intList = new LinkedList<Integer>(); 
intList.add(1); 
intList.add(new Integer(2)); 
... 
Integer first = intList.get(0); 
int second = intList.get(1); 

Nhưng điều này thực sự chỉ là trình biên dịch tự động chuyển đổi các loại cho bạn.

+0

Hmm, do đó, Java ít hiệu quả hơn. NET ở đây bởi vì nó buộc bạn để hộp số nguyên trước khi thêm nó vào bộ sưu tập? Đó là một trong những lợi ích thường thấy của 'Dictionary ' over 'HashTable' in .NET - bạn tránh boxing. –

+0

Ý nghĩa của "Thứ nguyên dự kiến ​​sau mã thông báo này" là gì? Nó đề cập đến một mảng, như 'int []' mà sẽ là không sao bởi vì nó là một đối tượng 'Array'? – ADTC

4

Bộ sưu tập Java chỉ cho phép các tham chiếu không phải là các tài liệu gốc. Bạn cần phải sử dụng các lớp wrapper (trong trường hợp này java.lang.Integer) để làm những gì bạn đang sau:

private Dictionary<String, Integer> map; 

họ bạn có thể làm những việc như:

int foo = map.get("hello"); 

map.put("world", 42); 

và Java sử dụng autoboxing/unboxing để xử lý các chi tiết của chuyển đổi cho bạn.

Here là một mô tả nhỏ về nó.

+0

Tôi đã đề cập rằng nó hoạt động 'Integer' trong bài gốc. Tôi đã hy vọng cho một lời giải thích về lý do tại sao –

+0

Cảm ơn bạn đã chỉnh sửa, tôi đã xóa -1 :) –

+0

Isn't int [] không phải là nguyên thủy? Nó có thể chỉ mong đợi một mảng, phải không? –

0

Bởi vì trong Java các nguyên thủy là nguyên thủy thực sự. Trong Java int sẽ chuyển giá trị, trong khi Integer sẽ chuyển một tham chiếu. Trong .NET int hoặc Int32, vv chỉ là các tên khác nhau.

+0

Ngoại trừ Generics là một phần của quá trình biên dịch, không có gì được "thông qua" trong ví dụ của poster. – JohnE

+0

FYI, int/Int32 sẽ chuyển qua tham chiếu trong .NET vì chúng là các loại giá trị (và do đó trực tiếp trên ngăn xếp). –

+0

Ngoài ra, 'int' chỉ là một bí danh cho' Int32' trong C#. VB.NET sử dụng 'Integer' –

9

Trong các loại .Net, "nguyên thủy" được hỗ trợ bởi các đối tượng. Trong Java, có một sự phân biệt cứng giữa các kiểu nguyên thủy và các đối tượng. Java 5 đã giới thiệu autoboxing, có thể ép buộc giữa hai trường hợp trong một số tình huống nhất định. Tuy nhiên, vì hệ thống Generics Java sử dụng kiểu xóa, không có đủ thông tin để autobox trong trường hợp này.

1

Để mở rộng câu trả lời của TofuBerer.

int là nguyên thủy

Số nguyên là một đối tượng.

Generics không hỗ trợ nguyên thủy.

+1

Tôi muốn nói đó là nhiều hơn một bản tóm tắt hơn một mở rộng :) –

+1

Ông edited bài viết của mình kể từ khi tôi :) – Keibosh

1
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class) 

Thats lừa xác định loại để làm cho nó làm việc với nguyên thủy

Trong adapter của bạn

sử dụng cùng trong gói-info sẽ có nghĩa là bạn làm điều đó trên toàn cầu cho rằng gói

Tìm thấy điều này sau khi thử nghiệm.

public class MyAdapter extends XmlAdapter<String, Integer> { 
Các vấn đề liên quan