2009-10-20 11 views
6

Tôi đang chuyển đổi thủ công mã từ Java (1.6) sang C# và tìm một số khó khăn với hành vi của nguyên thủy (int và double). Trong C# có vẻ như hầu hết tất cả các chuyển đổi xảy ra tự độngLàm autoboxing và unboxing hoạt động khác nhau trong Java và C#

 List<double> list1 = new List<double>(); // legal, C# 
     double d0 = 3.0; 
     list1.Add(d0);       // legal, C# 
     Double dd = 2.3f;       // legal, C# 
     list1.Add(dd);       // legal, C# 
     List<Double> list2 = new List<Double>(); // legal, C# 
     double d1 = 3.0; 
     list2.Add(d1);       // legal, C# 
     list2.Add(2.0);       // legal, C# 
     double d2 = list2.get(0);     // legal, C# 

nhưng trong Java chỉ có một số được phép

 List<double> list1 = new ArrayList<double>(); // illegal, Java 
     List<Double> list2 = new ArrayList<Double>(); // legal, Java 
     double d1 = 3.0; 
     list2.add(d1);         // legal, Java 
     list2.add(2.0);        // legal, Java 
     double d2 = list2.get(0);      // legal, Java 

Tôi muốn được biết ơn đối với một hệ thống phân tích sự khác biệt và bất kỳ lý do cơ bản.

Trả lời

6

Trong ví dụ C# của bạn, không có hoạt động đấm bốc hoặc unboxing (và autoboxing) xảy ra. double chỉ là bí danh cho số structDouble.

Trong Java, quyền anh là cần thiết. Do số type erasure, bạn không thể tạo số List<double>, chỉ List<Double>. Tại thời điểm biên dịch, List<?> trở thành List<Object> và việc bỏ/mở hộp sẽ cần phải diễn ra để bạn có thể thêm biến kiểu gốc vào số List<Object> hoặc gán biến gốc cho một phần tử trong Danh sách.

+0

Tôi đã có ấn tượng rằng Danh sách tồn tại lâu trước khi xóa Erasure bằng Java hoặc tôi có hiểu lầm những gì bạn đang nói không? – RHSeeger

+1

@RHSeeger, Danh sách là Loại chung. Generics trong Java ở đâu/được thực hiện với Type Erasure. Vì vậy, điều này ngụ ý rằng Danh sách đã không tồn tại trước khi loại Erasure (ít nhất là với các tham số Type). Lưu ý rằng, Danh sách sẽ được dịch sang Danh sách loại thô. –

16

Trong C#, doubleDoublechính xác điều tương tự (miễn là bạn chưa tạo kiểu riêng của bạn được gọi là Double, đó sẽ là ngu ngốc).

doubleđược xác định làm bí danh cho global::System.Double. Như vậy, không có quyền anh ở đây.

Trong java, Double là một đóng hộp double, với loại tẩy xóa là một phần quan trọng của việc thực hiện Generics.