Tại sao không nhất quán?
Tôi có thể nói đây không phải là mâu thuẫn. Điều này về cơ bản là một vấn đề của sự hiểu biết về Generics. Xét đoạn mã sau (mã sửa đổi của bạn):
class Outer<T> {
class Inner{
T t;//Added this extra line
}
static class Nested {
Inner inner;
}
}
Trong ví dụ trên đây là hơi tương tự như những gì bạn đã viết duy nhất tôi đã thêm một biến mới t
loại T
đó là thuốc generic của Outer
lớp trong lớp Inner
. Bây giờ trong ví dụ trên sẽ không biên dịch vì có tham chiếu không tĩnh hoặc thời gian chạy trong lớp Inner
, vì vậy, khi bạn khai báo Inner
trong lớp tĩnh Nested
trình biên dịch JAVA không biết loại T
, chỉ được khai báo trong thời gian chạy, vì vậy bạn gặp lỗi. Nhưng trong trường hợp của bạn, bạn đã không làm gì như thế nhưng trình biên dịch vẫn không biết liệu có cái gì đó như thế có hiện diện hay không. Vì vậy, nó cung cấp cho các lỗi.
Hiện tại trong trường hợp thứ hai, bạn đã xóa số chung T
khỏi tuyên bố lớp học của Outer
. Vì vậy, không có khả năng khai báo biến t
trong lớp Inner
do đó không có lỗi.
Trong trường hợp thứ ba bạn khai báo Outer.Inner
cho loại biến inner
và được biên dịch thành công.Tại đây trình biên dịch được xem là Outer
là LOẠI RAW. Nhưng nên tránh loại khai báo kiểu thô này. Vì vậy, nó sẽ tốt hơn nếu viết:
Outer<?>.Inner inner;
Dưới đây trình biên dịch Java coi Outer
thực hiện bất kỳ đối tượng như các thông số đó sẽ kế thừa Object
.
Vâng, bạn có thể tham chiếu 'T' trong' Bên trong', ví dụ: biến thành viên. Làm thế nào 'Nested' sẽ biết bất cứ điều gì về loại đó nếu' Outer' là chung? –
Thay đổi dòng đó thành 'Outer. Bên trong bên trong;' hoặc một số chuyên môn khác của 'T' –