在 Groovy 脚本中导入内部枚举

Import inner enum in Groovy script

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

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

  public enum Water {
    SAILBOAT,
    MOTORBOAT
  }

  public enum Air {
    JET,
    HELICOPTER
  }
}

我想在与 Vehicles.groovy.

相同的目录中的脚本 run.groovy 中引用这些枚举

完全限定枚举实例有效。

import Vehicles
println Vehicles.Land.BICYCLE

import static Vehicles.Land
println Vehicles.Land.BICYCLE

import Vehicles.Land.*
println Vehicles.Land.BICYCLE

正确打印BICYCLE.

但是,我想引用 Land 枚举而不完全限定它。

我基本上尝试了 static/non-static、aliased/non-aliased 和 star/non-star 导入的所有组合。

import Vehicles.Landimport static Vehicles.Land.*(或 import Vehicles.Land as Land)给出 unable to resolve class 错误。这看起来很奇怪,因为它们是人们在 Java 中会做的事情(如果我错了请纠正我。)

如果我尝试

import static Vehicles.Land
println Land.BICYCLE

import static Vehicles.Land as Land
println Land.BICYCLE

import Vehicles.Land.*
println Land.BICYCLE

,我得到错误

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)

同样,

import Vehicles.Land.*
println BICYCLE

给予

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)

Vehicles.groovyrun.groovy 添加包声明似乎也没有帮助。

所以...

注意:我使用的是 Groovy 1.8.6 和 Oracle JDK 1.8.0_45.

下面你试过了吗?

import static Vehicles.Land.*

println BICYCLE

编辑:这是您要查找的内容吗?

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

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

不同于 Java,其中 enums are implicitly static, it appears that enums in Groovy are not implicitly static, hence why static imports don't work. This is because enums in Groovy aren't actually the same as the ones in Java, they made enhancements。不幸的是,他们似乎忘记告诉编译器也使它们隐式静态(至少从 2.4.4 开始)。

我的建议是明确声明它们是静态的(如果可以的话),因为这与 Groovy 有效 Java 有效 Groovy.[=13= 的概念保持一致]