在Groovy脚本中导入内部枚举

jia*_*gty 5 import groovy enums static inner-classes

我定义了一个Groovy类,Vehicles.groovy其中包含一些内部枚举:

public class Vehicles {
  public enum Land {
    BICYCLE,
    CAR,
    TRAIN
  }

  public enum Water {
    SAILBOAT,
    MOTORBOAT
  }

  public enum Air {
    JET,
    HELICOPTER
  }
}
Run Code Online (Sandbox Code Playgroud)

我想run.groovy在与相同目录下的脚本中引用这些枚举Vehicles.groovy

完全限定枚举实例有效。

import Vehicles
println Vehicles.Land.BICYCLE
Run Code Online (Sandbox Code Playgroud)

要么

import static Vehicles.Land
println Vehicles.Land.BICYCLE
Run Code Online (Sandbox Code Playgroud)

要么

import Vehicles.Land.*
println Vehicles.Land.BICYCLE
Run Code Online (Sandbox Code Playgroud)

正确打印BICYCLE

但是,我想在Land不完全限定枚举的情况下引用该枚举。

我基本上尝试了静态/非静态,别名/非别名和星号/非星号导入的每种组合。

import Vehicles.Landimport static Vehicles.Land.*(或import Vehicles.Land as Land)给出unable to resolve class错误。这似乎很奇怪,因为它们就是Java中要执行的操作(如果我输入错了,请纠正我。)

如果我尝试

import static Vehicles.Land
println Land.BICYCLE
Run Code Online (Sandbox Code Playgroud)

要么

import static Vehicles.Land as Land
println Land.BICYCLE
Run Code Online (Sandbox Code Playgroud)

要么

import Vehicles.Land.*
println Land.BICYCLE
Run Code Online (Sandbox Code Playgroud)

,我得到了错误

Caught: groovy.lang.MissingPropertyException: No such property: Land for class: run
groovy.lang.MissingPropertyException: No such property: Land for class: run
        at run.run(run.groovy:2)
Run Code Online (Sandbox Code Playgroud)

同样,

import Vehicles.Land.*
println BICYCLE
Run Code Online (Sandbox Code Playgroud)

Caught: groovy.lang.MissingPropertyException: No such property: BICYCLE for class: run
groovy.lang.MissingPropertyException: No such property: BICYCLE for class: run
    at run.run(run.groovy:2)
Run Code Online (Sandbox Code Playgroud)

添加包声明既Vehicles.groovyrun.groovy似乎并没有帮助,无论是。

所以...

  • Groovy对导入内部类有什么支持?为什么它与Java不同?
  • 如何获得Groovy以允许我引用非完全限定的内部枚举?

注意:我正在使用Groovy 1.8.6和Oracle JDK 1.8.0_45。

xlm*_*xlm 7

Groovy 确实支持导入嵌套类,包括枚举。但是,要在没有完全限定的情况下访问它们,您需要以非静态方式(与 Java 不同)导入它们,或显式声明它们为静态:

// Explicitly declare Water and Air as static to demonstrate
public class Vehicles {
  public enum Land { BICYCLE, CAR, TRAIN }
  public static enum Water { SAILBOAT, MOTORBOAT }
  public static enum Air { JET, HELICOPTER }
}

// Non-static nested enum needs non-static import (unlike Java)
import Vehicles.Land
println Land.BICYCLE

// Explicitly static nested enum can be static imported
import static Vehicles.Water
println Water.SAILBOAT

// Explicitly static nested enum can also be non-static imported as well!
import Vehicles.Air
println Air.JET
Run Code Online (Sandbox Code Playgroud)

工作示例:https : //groovyconsole.appspot.com/script/5089946750681088

枚举隐式 static 的Java 不同,Groovy 中的枚举似乎不是隐式静态的,因此静态导入不起作用。这是因为 Groovy 中的枚举实际上与 Java 中的枚举不同,它们进行了增强。不幸的是,他们似乎忘记告诉编译器也使它们隐式静态(至少从 2.4.4 开始)。

我的建议是将它们显式声明为静态(如果可以的话),因为它符合 Groovy 的概念,即有效的 Java 是有效的 Groovy。


Rao*_*Rao 5

你试过下面吗?

import static Vehicles.Land.*

println BICYCLE
Run Code Online (Sandbox Code Playgroud)

编辑:这就是你要找的吗?

  • 正如我在我的问题中所说,`import static Vehicles.Land.*` 抛出 `org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:` `run.groovy: 1: 无法解析类 Vehicles.Land` (3认同)
  • 同样,静态导入工作正常,但 _not_ 静态导入 *. (3认同)