2013-07-12 24 views
5

Sự hiểu biết của tôi là lý do tại sao có các loại thô và loại tẩy xoá trong Java là vì tại thời điểm generics được giới thiệu, có các API chuẩn không thể được tạo chung mà không vi phạm mã hiện có.Tại sao Java (nhưng không .NET) không thể chứa các generics mà không cần loại thô/loại xóa?

Generics cũng được giới thiệu với .NET tại một số điểm trên đường, nhưng tính năng này đã được triển khai theo cách không phụ thuộc vào loại thô hoặc loại xóa (và nếu có, nó theo cách đó minh bạch cho người dùng). Vì vậy, các API hiện tại vẫn không thay đổi (ví dụ, mã trong không gian tên System.Collections) và các API chung mới được giới thiệu (ví dụ, mã trong không gian tên System.Collections.Generic).

Vì vậy, làm thế nào đến Generics Java, không giống như Generics NET., Yêu cầu loại thô/loại tẩy xoá?

Trả lời

8

.Net giới thiệu generics bằng cách thay đổi ngôn ngữ bytecode, máy ảo và JITter để nhận dạng các loại chung.
Đây là một lượng lớn công việc mất khoảng hai năm.

Java giới thiệu generics như một tính năng hoàn toàn biên dịch-thời gian, chỉ với những thay đổi thời gian chạy nhỏ (mới siêu dữ liệu và phản ánh API).
Đây là một nhiệm vụ đơn giản hơn nhiều, và nó duy trì tính tương thích ngược với các thời gian chạy cũ hơn, nhưng nó khó chịu hơn nhiều để làm việc.

+3

Ngoài ra, .Net đã thay thế các vùng chứa hiện tại bằng các phiên bản chung trong một không gian tên khác. Mã mà muốn sử dụng chúng phải được chuyển khá nhiều cùng một lúc. Cách của Java cho phép họ chỉ đơn giản là làm cho các thùng chứa hiện có chung chung, do đó, chuyển từng bit một có nghĩa là chỉ thỉnh thoảng bỏ qua và bỏ qua cảnh báo. –

+0

@SebastianRedl: Về cơ bản, phần mở rộng của generics là một tính năng biên dịch-chỉ-thời gian. – SLaks

+0

Mặc dù .NET đã thay đổi ngôn ngữ bytecode, tôi không nghĩ Java sẽ nhất thiết phải làm như vậy để cho phép các đối tượng chung biết loại của chúng. Tôi sẽ nghĩ rằng mọi trường hợp đối tượng chung có thể chứa một hoặc nhiều trường được tạo bởi trình biên dịch biểu thị sự kết hợp của các kiểu đã được tạo ra và cho trình biên dịch tạo mã để xác nhận các trường đó khi thích hợp. Tôi nghĩ rằng một vấn đề lớn hơn sẽ xảy ra nếu một 'ArrayList ' được triển khai thành bất kỳ loại nào khác ngoài 'ArrayList' ... – supercat

3

Mặt trời đặc biệt quan tâm để đảm bảo khả năng tương thích ngược với tư cách là một phần mềm Java được thiết lập lớn. Để làm điều này, họ cảm thấy rằng tối thiểu các thay đổi trong JVM là tốt nhất. Trong tầm nhìn xa, điều đó dường như không phải là quyết định tốt nhất trong thời gian dài vì nó có nghĩa là JVM không thực sự hiểu generics và không thể tối ưu hóa nhiều kiểm tra lớp thừa.

Oracle bằng cách so sánh đã ít miễn cưỡng hơn khi thay đổi JVM và đã phải chịu nhiều lỗi nghiêm trọng và công khai hơn. để làm với an ninh. (Họ không có ý giống nhau nhưng người ta có thể dẫn đến người khác) Mặc dù vậy, Oracle đã bổ sung chỉ một hướng dẫn cho JVM mà Java thậm chí không sử dụng, trong khi Sun không thêm gì để nó tương đối thực sự. ;)

Mặt khác, Microsoft có cơ sở mã nhỏ hơn cho C# và khách hàng được sử dụng nhiều hơn đáng kể, thậm chí phá vỡ các thay đổi giữa các phiên bản chính. Điều này có nghĩa là đau đớn hơn trong ngắn hạn nhưng có thể là một lựa chọn tốt hơn trong dài hạn. Bạn có ít vấn đề hơn là do lý do lịch sử còn lại.

Tóm lại sự khác biệt không phải là kỹ thuật, nó mang tính chính trị và lịch sử hơn.

+1

Sự khác biệt là ** cực kỳ ** kỹ thuật. – SLaks

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