我在"invoke failed!service[%s],errno[%d],desc[%s]"
中定义了一个包含一些内部枚举的Groovy类:
Vehicles.groovy
我想在public class Vehicles {
public enum Land {
BICYCLE,
CAR,
TRAIN
}
public enum Water {
SAILBOAT,
MOTORBOAT
}
public enum Air {
JET,
HELICOPTER
}
}
的同一目录中的脚本run.groovy
中引用这些枚举。
完全限定枚举实例。
Vehicles.groovy
或
import Vehicles
println Vehicles.Land.BICYCLE
或
import static Vehicles.Land
println Vehicles.Land.BICYCLE
正确打印import Vehicles.Land.*
println Vehicles.Land.BICYCLE
。
但是,我想在没有完全限定的情况下引用BICYCLE
枚举。
我基本上尝试了静态/非静态,别名/非别名以及星/非星级导入的每种组合。
Land
或import Vehicles.Land
(或import static Vehicles.Land.*
)会出现import Vehicles.Land as Land
错误。这看起来很奇怪,因为他们会用Java做什么(如果我错了,请纠正我。)
如果我尝试
unable to resolve class
或
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.groovy
添加包声明似乎也无济于事。
因此...
注意:我使用的是Groovy 1.8.6和Oracle JDK 1.8.0_45。
答案 0 :(得分:3)
你在下面试过吗?
import static Vehicles.Land.*
println BICYCLE
编辑:这就是你要找的东西吗?
答案 1 :(得分:1)
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不同的是,Groovy中的枚举似乎不是不是隐式静态的,因此为什么静态导入不起作用。这是因为Groovy中的枚举实际上与Java中的枚举不同,因此它们的名称为enhancements。不幸的是,它们似乎忘记了告诉编译器也将它们隐式地设置为静态(至少从2.4.4开始)。
我的建议是(如果可以的话)显式地声明它们为静态的,这与Groovy认为有效的Java是有效的Groovy的想法保持一致。