Tôi đã học và thử nghiệm với Java Generics trong một thời gian nhưng tôi đã chạy vào một cái gì đó mà tôi không thể giải thích. Lấy ví dụ đoạn mã sau:Các lớp bên trong được nhập chung trong Java
public class Question {
public <T> Sub<T> getSub(Class<T> c) {
return new Sub<T>(c);
}
public class Sub<S> {
private Class<S> c;
public Sub(Class<S> c) {
this.c = c;
}
public void add(S s) {
}
}
}
Và mã kiểm tra:
import generics.Question.Sub;
public class Answer {
public static void main(String [] args) {
Question q = new Question();
Sub<String> s = q.getSub(String.class);
s.add("");
}
}
Khi điều này được chạy nó đưa ra một thông báo lỗi tuyệt vời khó hiểu:
C:\Answer.java:8: incompatible types
found : generics.Question.Sub<java.lang.String>
required: generics.Question.Sub<java.lang.String>
Sub<String> s = q.getSub(String.class);
1 error
Bây giờ, thông qua một số thử nghiệm Tôi đã làm việc ra làm thế nào để ngăn chặn lỗi trình biên dịch. Tôi có thể làm cho lớp Sub trở thành lớp bên trong tĩnh, hoặc tôi cần tham khảo lớp Sub như Question.Sub <String>. Những gì tôi không thể làm là giải thích tại sao tôi cần phải làm điều này.
Tôi đã thực hiện một số đọc tài liệu Java về Generics nhưng không bao gồm trường hợp cụ thể này.
Mọi người có thể giải thích tại sao mã này là loại không tương thích trong biểu mẫu hiện tại không?
-Edit-
Nhìn vào điều này gần hơn tôi có thể thấy rằng tôi nhận được cùng một hành vi bên ngoài Netbeans. Nếu tôi có mã trong cấu trúc sau:
generics\
generics\Question.java
generics\Answer.java
Khi tôi biên dịch các tập tin với nhau, tôi không nhận được lỗi:
C:\>javac generics\Question.java generics\Answer.java
C:\>
Tuy nhiên, khi tôi lập Câu hỏi đầu tiên và sau đó trả lời, tôi gặp lỗi:
C:\>javac generics\Question.java
C:\>javac generics\Answer.java
generics\Answer.java:8: incompatible types
found : generics.Question.Sub<java.lang.String>
required: generics.Question.Sub<java.lang.String>
Sub<String> s = q.getSub(String.class);
^
1 error
Tôi đã nghe một số điều được đề cập về Loại xóa. Đây có phải là trường hợp trong tình huống này không?
Mã này hoạt động đối với tôi trong Eclipse. Bạn đang sử dụng IDE/trình biên dịch nào? – polygenelubricants
Tôi cũng có thể biên dịch điều này mà không gặp sự cố khi sử dụng phiên bản java "1.6.0_15" – Steen
Netbeans 6.7.1 với JDK 1.5.0_14. Nếu tôi biên dịch nó bên ngoài Netbeans, tôi đồng ý, nó biên soạn tốt. Tôi sẽ điều tra thêm. Cảm ơn vì bạn đã phản hồi. – gencoreoperative