2010-01-04 25 views
20

Trong Java, tôi có thể mở rộng từ siêu kiểu chung không? Theo bài viết này, có vẻ như tôi sẽ có thể: http://www.ibm.com/developerworks/java/library/j-djc05133.html.Mở rộng từ Supertype chung?

public abstract class MyClass<T> extends T { 

Tuy nhiên, khi tôi làm điều gì đó tương tự trong ứng dụng của tôi, tôi nhận được lỗi sau: "Không thể tham khảo các tham số kiểu T như một supertype."

Có ai biết nếu tôi có thể mở rộng từ siêu kiểu chung trong Java không? Và, nếu có, có điều gì đặc biệt cần thiết để thực hiện điều này không?

EDIT: Tôi đã đọc sai bài viết. Nó thực sự đang thảo luận về các vấn đề tiềm năng của việc này.

+1

Bạn có thể hiển thị cho chúng tôi khai báo từ mã của bạn ... có vẻ như bạn đang sử dụng sai cú pháp. –

Trả lời

9

Bạn có thể kế thừa từ siêu kiểu có thông số loại chung. Ví dụ:

public class MyList<T> extends AbstractList<T> 

(hoặc thậm chí cung cấp các thông số giới hạn, ví dụ):

public class MyStringList extends AbstractList<String> 

Bạn đang không thể xác định một lớp học có một siêu kiểu ký tự đại diện. Một khái niệm như vậy không có ý nghĩa gì trong Java (và tôi không tin rằng nó có nhiều giá trị trong bản tóm tắt). Trong ví dụ MonitoredDevice của bạn, tôi thậm chí không chắc chắn chức năng nào bạn mong đợi ở đó.

Vì việc xóa bỏ điều này đơn giản là không thể ở mức cơ bản của cách Java hoạt động. Mỗi lớp phải có một lớp cha - lớp bậc trên của MonitoredDevice là gì? Phương pháp nào có sẵn trên đối tượng MonitoredDevice? Bạn sẽ không thể gọi bất kỳ phương thức kế thừa nào trong lớp này vì trình biên dịch không thể đảm bảo các phương thức như vậy tồn tại, cũng như không thể bytecode đại diện cho các cuộc gọi như vậy.

Tôi nghi ngờ rằng những gì bạn đang cố gắng thực hiện có thể đạt được tốt hơn với dynamic proxies.

Chỉnh sửa: OK, sau khi đọc toàn bộ bài viết tôi có thể thấy động lực đằng sau tuyên bố như thế nào. Nhưng sau khi đọc bài báo đầy đủ, bạn cũng nhận ra rằng điều này không được hỗ trợ bởi Java hiện nay. Lý do cơ bản tại sao là do tẩy xoá; một kỹ thuật như vậy sẽ không bao giờ có thể thực hiện được dưới cơ chế hiện tại, và bài báo đi sâu vào chi tiết hơn về những gì cụ thể ngăn cản việc này hoạt động.

+0

Điều đó có ý nghĩa với tôi. Tôi chỉ đơn giản muốn có khả năng xác định động kiểu cha của lớp; và có vẻ như tôi có thể làm điều đó bằng cách sử dụng Generics. Nhưng, tôi không phải là một lập trình viên Java tiên tiến và không biết chi tiết cấp thấp của ngôn ngữ Java. Tôi sẽ xem xét các proxy động. Cảm ơn. EDIT: Đã viết nhận xét này trước chỉnh sửa cuối cùng của bạn. ;) –

2

Từ thông báo lỗi đó, có vẻ như bạn đang cố mở rộng từ chính thông số loại mà bạn không thể làm vì loại này bị xóa khi chạy. Nếu đây không phải là những gì bạn đang cố gắng làm, vui lòng đăng mã của bạn.

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