Đâ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
đangSau 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?
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