2016-09-03 22 views
24

Như tôi biết, một trong những mục đích chính của Generics trong Java là cung cấp tính an toàn kiểu thời gian biên dịch. Nếu nó được biên dịch, mã sẽ chạy mà không có sự cố.Chuỗi được gán cho một Danh sách không có lỗi biên dịch

Sau đó, tại sao mã sau được biên dịch?

public static void main(String[] args) { 
    String s = getList(); 
} 

private static <T extends List> T getList() { 
    return (T)new ArrayList(); 
} 

Nó biên dịch tốt. Trình biên dịch an toàn loại của tôi ở đâu? Phương thức getList() không có điểm chung với lớp String.

+1

Không, điều này biên dịch ngay cả khi sử dụng các loại không phải thô. –

+0

@MarkusFischer, Tôi cũng nghĩ về điều đó, nhưng trình biên dịch nhận ra rằng String là một lớp cuối cùng và không thể có bất kỳ lớp con nào – Andrew

+1

@MarkusFischer, bạn nên chuyển nhận xét này thành câu trả lời. Tôi nghĩ đó chính xác là vấn đề op được quan sát ở đây. 'MyClass mở rộng chuỗi thực hiện List' có thể có thể tại thời gian biên dịch như trình biên dịch không xem xét String là' cuối cùng', như bạn đã nói, cho những loại kiểm tra chung chung. – Zabuza

Trả lời

13

Đây không phải là vấn đề loại tẩy xóa, nhưng gần như ngược lại: Bạn gặp vấn đề khi chạy, khi hệ thống biết loại thực tế, nhưng không phải lúc biên dịch. Lý do tại sao biên dịch này là List là một giao diện. Theo như trình biên dịch có liên quan, một lớp con của String có thể thực sự triển khai giao diện đó, vì vậy lý do trình biên dịch có thể là các tình huống thời gian chạy hợp lệ mà đối tượng thực sự trả về là String cũng là List. Trình biên dịch không xem xét rằng String là cuối cùng, và do đó không thể thực sự tạo ra một lớp List -implementing String.

Vì lý do cuối cùng không được xem xét trong quá trình biên soạn, nhận xét của Bohemian cho câu hỏi đưa ra một giải thích tốt.

+0

Có nên ít nhất là một cảnh báo trình biên dịch không? Tôi đã không kiểm tra javac chính nó, nhưng IDE của tôi không cảnh báo về bất cứ điều gì, nhưng một loại bỏ chọn và các loại thô. Tôi có thể làm việc lên các ví dụ không có loại thô và nơi không có cảnh báo, nhưng nơi loại rõ ràng là không chính xác. – RudolphEst

+0

Tôi đồng ý rằng một cảnh báo trình biên dịch sẽ tốt đẹp và sẽ có ý nghĩa cho tình huống này. Tôi cũng không thấy một từ javac lẫn Eclipse. Một lần nữa, điều này tóm lại bao nhiêu trường hợp cạnh trình biên dịch điều tra, và dường như một quyết định đã được thực hiện để không kiểm tra chòm sao này. –

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