2010-10-26 36 views
6

Câu hỏi của tôi là về các biến kiểu được sử dụng trong các lớp và phương thức chung.Biến loại chung Java

Tại sao chúng ta không thể làm điều gì đó như thế này T = new T(); hoặc nói cách khác, tại sao chúng ta không thể xây dựng một đối tượng của biến kiểu?

Tôi biết rằng thông tin chung sẽ bị xóa trong khi biên dịch và mọi thứ được chuyển thành
Đối tượng, vậy tại sao trình biên dịch không giả định rằng T là một đối tượng và để chúng tôi xây dựng?

+0

Đây là một câu hỏi hay. Nó minh họa một số nhược điểm vốn có trong Java Generics và một số rò rỉ trong trừu tượng. Ngẫu nhiên, bạn cũng không thể tạo một mảng 'T []' cho cùng một lý do - loại xóa. –

Trả lời

9

Vấn đề là khi chạy JVM không biết lớp nào là T thực sự là viết tắt của (thông tin đó không được giữ lại trong thời gian chạy, đó là ý nghĩa của "loại tẩy xóa"). Do đó JVM chỉ thấy rằng bạn muốn xây dựng một T mới, nhưng không biết nhà xây dựng nào thực sự gọi - do đó nó không được phép.

Có cách giải quyết khác, nhưng nó sẽ không hoạt động như bạn đề xuất.

tại sao không trình biên dịch cho rằng T là một đối tượng và chúng ta hãy xây dựng nó ??

Vâng, tất nhiên thời gian chạy chỉ có thể xây dựng một phiên bản java.lang.Object cho bạn, nhưng điều đó sẽ không thực sự hữu ích, vì bạn thực sự muốn có một số T.

+0

một điều, hiện thời gian chạy thấy T hoặc đối tượng, không phải là thông tin chung bị xóa, ?? –

+0

Tôi không biết thời gian chạy "nhìn thấy" là gì, vì tôi không biết cách thực hiện điều này trong nội bộ. Tôi tin rằng nó chỉ không thấy bất kỳ loại nào cả. Nó có thể có thể phân biệt giữa các trường hợp có thực sự là "đối tượng" được viết trong mã, và trường hợp một loại đã bị xóa. – sleske

+1

Nó chỉ thấy một 'Object'. –

2

Ngoài câu trả lời của sleske; nếu bạn cần tạo các đối tượng của T bên trong lớp chung của bạn, giải pháp là chuyển một tham chiếu Class<T> làm đối số cho hàm tạo hoặc phương thức cần tạo đối tượng mới và sử dụng lớp đó để tạo các cá thể mới.

+1

hoặc chuyển vào Nhà máy ? – Ishtar

+0

Vâng, đó là ý tôi là "có cách giải quyết". Cảm ơn bạn đã thêm nó :-). – sleske

+0

Tôi không bỏ qua cách tiếp cận này, nhưng nếu bạn muốn viết mã thực sự hacky, bạn vẫn có thể làm việc xung quanh nó bằng cách sử dụng sự phản chiếu. '((ParametrizedType) getClass()). GetActualTypeArguments() [0] .createNewInstance()'. Điều này giả định một constructor mặc định của khóa học. –

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