Tôi không hiểu lỗi trình biên dịch xuất phát từ mã sau đây. Tôi xác định giao diện chung, xem Tác vụ, với hai phương pháp: U doSomething(String value)
và List<Integer> getIDs()
. Phương thức doSomething() thực sự sử dụng kiểu generic như kiểu giá trị trả về của nó, nhưng dường như không gây ra vấn đề gì. Phương thức getIDs()
trả về một Danh sách, không liên quan đến loại Tác vụ, nhưng nó gây ra các vấn đề khi sử dụng lệnh for..each để lặp lại giá trị trả về. Lỗi trình biên dịch sau xảy ra.Lỗi trình biên dịch trên giao diện chung Java với phương thức List <>
error: incompatible types for (Integer value : task.getIDs()){ required: Integer found: Object
Dường như các loại tẩy xoá trên giao diện đang gây ra trình biên dịch để quên đi những kiểu được khai báo theo phương pháp thứ hai, đó là không liên quan đến các loại generic. Hay nói cách khác là loại chung trên giao diện ảnh hưởng đến cách trình biên dịch hiểu giá trị trả về theo phương pháp getIDs()
và cụ thể trong ngữ cảnh của câu lệnh for..each?
Dường như tôi có tham chiếu đến danh sách bên ngoài for..each không có vấn đề gì, nhưng không trực tiếp.
public class InterfaceTest {
public static void main(String[] args) {
Task task = new MyTask();
// no complaints about the type here
List<Integer> values = task.getIDs();
// getting a compiler error for this line
for (Integer value : task.getIDs()){
}
}
}
interface Task<U>{
U doSomething(String value);
List<Integer> getIDs();
}
Việc thực hiện của giao diện là không cần thiết để chứng minh điểm, nhưng tôi không muốn để lại tài liệu tham khảo Task task = null;
và có câu trả lời của nói với tôi đó là vấn đề.
class MyTask implements Task<Boolean>{
@Override
public Boolean doSomething(String value) {
System.out.println(value);
return false;
}
@Override
public List<Integer> getIDs() {
return Arrays.asList(1, 2, 3, 4);
}
}
Nó làm gì với 'return new int [] {1,2,3,4}', hoặc 'return Arrays.asList (new Integer (1), new Integer (2), ...);' ? (lưu ý, không phải giả định. hãy thử nó, thêm kết quả cho câu hỏi để cho thấy rằng boxing/unboxing rõ ràng đang làm điều gì đó kỳ lạ) –
Đây là một câu hỏi rất hay; câu trả lời có lẽ là ẩn sâu trong ruột của JLS. – arshajii
@arshajii: Bạn đã thay đổi 'U doSomething (String value)' từ 'U doSomething (U value)'? Tôi nghĩ rằng mã đăng không thực sự là những gì OP đang làm. –