2015-05-28 31 views
16

Về cơ bản, tôi có câu hỏi về lý do tại sao các thao tác sau không hoạt động. Tôi có một lớp trừu tượng:Sử dụng kiểu lồng nhau làm đối số kiểu chung trong khai báo siêu kiểu của lớp kèm theo

public abstract class Abstrct <T> { 

} 

sau đó tôi định nghĩa một lớp mà làm cho sử dụng của lớp đó với một lớp bên nào định nghĩa mà tôi muốn sử dụng cho các thông số chung chung, như sau:

public class Outer extends Abstrct<Inner> { 
    public class Inner { 

    } 
} 

Khi tôi đang học Java vẫn còn, tôi quan tâm hơn đến lý do tại sao nó không hoạt động. Không nhiều như thế nào để làm cho nó hoạt động được, nhưng tôi cũng sẽ quan tâm đến điều đó.

Trả lời

17

Inner không nằm trong phạm vi cho tuyên bố lớp học Outer. Nó không phải là tên kiểu đã biết khi được sử dụng trong mệnh đề extends. Sử dụng một tài liệu tham khảo có trình độ:

class Outer extends Abstract<Outer.Inner> 

Hoặc nhập nó:

import com.example.Outer.Inner; 

Từ đặc điểm kỹ thuật, liên quan đến Scope:

Phạm vi của một tuyên bố của một thành viên m khai báo trong hoặc được thừa kế bởi a loại lớp C (§8.1.6) là toàn bộ phần thân của C, bao gồm mọi tuyên bố loại lồng nhau.

Mệnh extends là một phần của lớp Superclass khai, như mô tả trong Specification. Nó không phải là một phần của cơ thể lớp.

Phạm vi của một loại được sử dụng trong một tuyên bố import, tuy nhiên,

[..] là tất cả các khai báo lớp và loại giao diện (§7.6) trong đơn vị biên soạn trong đó nhập khẩu khai báo xuất hiện, cũng như bất kỳ chú thích nào trên khai báo gói (nếu có) của đơn vị biên dịch.

+6

Hoặc đơn giản tuyên bố 'public class Outer kéo dài Tóm tắt '. – RealSkeptic

7

Bạn có thể sử dụng Abstrct<Outer.Inner> làm cho loại không rõ ràng và hợp lệ.

0

Bạn phải rõ ràng vì lớp bên trong bạn đã xác định không tĩnh nên nó chỉ tồn tại trong phạm vi của lớp chứa. (Xem https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)

Trong trường hợp của bạn thử sau:

public class Outer extends Abstrct<Outer.Inner> { 
    public class Inner { 

    } 
} 
+0

Ngay cả khi tĩnh, chúng vẫn cần phải nhập hoặc sử dụng tên loại đủ điều kiện. –

Các vấn đề liên quan