2013-05-20 31 views
7

Đây là câu hỏi theo dõi Generic classes with Collection getter of other types của chrert. Nếu bạn có thể đưa ra một tiêu đề tốt hơn cho câu hỏi của tôi, cảm thấy tự do để chỉnh sửa nó:Các loại thô với các phương pháp chung không phụ thuộc vào loại chung

đang

Sau chứa một lớp generic GenericClass<T> với một phương pháp lợi nhuận loại T và phương pháp khác với sự trở lại loại Collection<String>, mà rõ ràng là không phụ thuộc vào T.

Bây giờ, nếu tôi khởi tạo GenericClass thô (mà tôi sẽ không bao giờ làm, vì vậy câu hỏi này là câu hỏi lý thuyết hơn, để giúp hiểu những gì đang xảy ra), sau đó gọi phương thức đó trong vòng lặp nâng cao sẽ không hoạt động, bởi vì tất cả các thông tin chung loại dường như bị mất khi sử dụng các loại thô. Nhưng sau đó, khi gọi cùng một phương thức đó trong một bài tập, nó hoạt động (nó cảnh báo về loại unsafety, nhưng nó biên dịch).

Theo quan điểm của tôi, cả hai đều không hoạt động hoặc cả hai đều hoạt động. Tôi không hiểu tại sao một người làm việc, và người kia thì không. Bạn có bất kỳ gợi ý nào hay biết bất kỳ phần nào của JLS giải thích hành vi này?

public class GenericClass<T> { 

    T doSomething() { 
     return null; 
    } 

    Collection<String> getCollection() { 
     return Collections.emptyList(); 
    } 

    public static void main(String[] args) { 
     GenericClass raw = new GenericClass(); 
     // This will not compile (Error message below) 
     for (String str : raw.getCollection()) { 
      // Type mismatch: cannot convert from element type Object to String 
     } 
     // This is only a warning: 
     // Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String> 
     Collection<String> coll = raw.getCollection(); 
     for (String string : coll) { 
      // works just fine 
     } 
    } 
} 

Có một câu hỏi có liên quan, trong đó, cùng với việc trả lời chấp nhận ở đây, giải thích những gì đang xảy ra khá tốt: Why won't this generic java code compile?

Trả lời

4

Trong trường hợp đầu tiên, raw.getCollection() trả về một nguyên Collection. JLS 14.14.2 quy định cụ thể các loại kiểm tra cho tăng cường for loop:

Nếu Kiểu (trong sản xuất FormalParameter) là một loại tài liệu tham khảo, sau đó TargetType thuộc nhóm máu; nếu không, TargetType là giới hạn trên của chuyển đổi chụp của đối số kiểu của I, hoặc Đối tượng nếu tôi là thô.

(nhấn mạnh thêm)

Trong trường hợp thứ hai, bạn đang rõ ràng gán một kiểu thô để một kiểu generic, được cho phép với một cảnh báo như bình thường.

+0

Sự nhấn mạnh và giải thích về trường hợp thứ hai làm cho nó hoàn toàn rõ ràng. Cảm ơn bạn! – jlordo

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