2009-11-04 57 views
6

这段代码怎么没有编译?Java:这怎么不编译?

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

编译报道:

enum declarations allowed only in static contexts. 

但后来当我把里面的枚举类A,一切都还好。

这很令人惊讶。我不认为我在C++中遇到了这个问题。

回答

10

您可以通过B上配置静态解决这个问题:

static class B { ... 

这更密切什么C++确实有嵌套类镜子。默认情况下(不包括static),B的实例包含对A实例的隐藏引用。

有关这些差异的很好的解释可以在Java inner class and static nested class找到。

+7

枚举是一种内在静态的野兽。在上面的例子中,你只希望有一个Enum.AD对象。但是如果你在一个非静态类中声明一个枚举,你会(理论上)需要一个不同的Enum.AD实例用于每个合并范围。这没有道理......因此它是被禁止的。 – 2009-11-04 06:59:32