Tôi gặp lỗi trình biên dịch lạ khi sử dụng generics trong vòng lặp for-each trong Java. Đây có phải là lỗi trình biên dịch Java hay tôi thực sự thiếu một thứ gì đó ở đây?Tại sao trình biên dịch Java phàn nàn về việc sử dụng foreach với một kiểu thô?
Dưới đây là toàn bộ lớp học của tôi:
public class Generics<T extends Object> {
public Generics(T myObject){
// I didn't really need myObject
}
public List<String> getList(){
List<String> list = new ArrayList<String>();
list.add("w00t StackOverflow");
return list;
}
public static void main(String...a){
Generics generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
}
Trình biên dịch được phàn nàn về phù hợp với for-each: "Loại không phù hợp có thể không chuyển đổi từ loại nguyên tố đối tượng để String"
Nếu tôi thực hiện thay đổi tinh tế này, nó biên dịch:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
Tôi biết getList()
không Generics sử dụng, nhưng nó sử dụng chúng trong những gì tôi nghĩ là một cách hoàn toàn không liên quan. Tôi có thể hiểu điều này nếu tôi cố gắng lặp lại một thứ gì đó thuộc loại T và getList()
trả về một số List<T>
hoặc một cái gì đó, nhưng đó không phải là trường hợp ở đây. Kiểu trả về của getList()
hoàn toàn không liên quan gì đến T và không nên quan tâm liệu tôi có sử dụng kiểu thô cho đối tượng Generics của mình hay không ... đúng không? Những thứ này không hoàn toàn không liên quan, hay tôi thực sự thiếu một thứ gì đó ở đây?
Lưu ý rằng mã cũng biên dịch nếu tôi làm điều này, mà tôi nghĩ cần phải có được tương đương với người đầu tiên cũng như:
public static void main(String...a){
Generics generics = new Generics(new Object());
List<String> list = generics.getList();
for(String s : list){
System.out.println(s);
}
}
'' không khác hơn ''. Bạn không tạo phiên bản chung của lớp bạn, bạn đang tạo kiểu thô. Điều này đưa chúng ta đến câu hỏi tại sao lớp học chung của bạn lại ở vị trí đầu tiên? Nơi duy nhất bạn sử dụng T là trong hàm tạo và bạn không sử dụng tham chiếu đó. –
unholysampler
Tôi đã sử dụng '' bởi vì tôi chỉ cần một cái gì đó cho một ví dụ. Mã thực sự rõ ràng là một cái gì đó khác, và nó sử dụng T ... nó chỉ sử dụng T theo cách hoàn toàn không liên quan đến 'getList()'. –
không liên quan đến câu hỏi của bạn, nhưng tôi muốn tạo hàm tạo là Generics cls) để bạn không phải khởi tạo một đối tượng kiểu T chỉ để xây dựng lớp Generics này. –
MeBigFatGuy