2009-11-04 22 views
6

Mã này không biên dịch như thế nào?Java: làm thế nào đến điều này không biên dịch?

class A 
{ 
    class B 
    { 
    public enum Enum <-- this line 
    { 
     AD, 
     BC 
    } 
    } 
} 

biên dịch báo cáo:

enum declarations allowed only in static contexts. 

Nhưng sau đó khi tôi đặt Enum lớp bên A, mọi thứ đều ổn.

Điều này khá bất ngờ. Tôi không nghĩ rằng tôi có vấn đề này trong C + +.

Trả lời

10

Bạn có thể khắc phục điều này bằng cách làm cho B tĩnh:

static class B { ... 

này phản ánh chặt chẽ hơn những gì trong C++ với các lớp lồng nhau. Theo mặc định (không có static), các phiên bản của B chứa tham chiếu ẩn đối với phiên bản A.

Giải thích rõ về sự khác biệt có thể tìm thấy tại Java inner class and static nested class.

+7

Một enum là một con thú thực sự tĩnh. Trong ví dụ trên, bạn chỉ muốn có một đối tượng Enum.AD. Nhưng nếu bạn khai báo một enum bên trong một lớp không tĩnh, bạn (theo lý thuyết) cần một cá thể khác nhau của Enum.AD cho mỗi phạm vi động. Điều đó không có ý nghĩa ... do đó nó bị cấm. –

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