Groovy无法解析静态类
我有以下Groovy脚本作为Groovy无法解析静态类,groovy,Groovy,我有以下Groovy脚本作为test.Groovy: import test.Vehicle def ok=new Vehicle(); def test=new Vehicle.Deserializer(); println "Hello, world!" 我有code/test/Vehicle.groovy,具有以下类定义: package test; public class Vehicle { public static class Deserializer { } }
test.Groovy
:
import test.Vehicle
def ok=new Vehicle();
def test=new Vehicle.Deserializer();
println "Hello, world!"
我有code/test/Vehicle.groovy
,具有以下类定义:
package test;
public class Vehicle {
public static class Deserializer {
}
}
但是,以下命令失败:
groovy -cp code/ test.groovy
(groovy-v
reports 2.4.7)
我希望它能成功,并打印出“你好,世界”。相反,我得到:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/tmp/test.groovy: 4: unable to resolve class Vehicle.Deserializer
@ line 4, column 10.
def test=new Vehicle.Deserializer();
^
1 error
由于脚本在前一行没有失败,Groovy找到了Vehicle
类而没有问题。它只是没有找到反序列化器
静态类
但是,此脚本工作正常:
public class Vehicle {
public static class Deserializer {
}
}
def ok=new Vehicle();
def test=new Vehicle.Deserializer();
println "Hello, world!"
当静态类(及其外部类)在单独的Groovy文件中定义时,我是否需要做些什么来允许Groovy使用静态类
更新:我发现并可以确认Groovy至少可以看到
反序列化程序类:
import test.Vehicle;
import static test.Vehicle.Deserializer;
println Deserializer.class.name
def ok=new Vehicle();
// def test=new Vehicle.Deserializer();
println "Hello, world!"
这与预期的效果一样:
test.Vehicle$Deserializer
Hello, world!
但是,取消注释def test=new Vehicle.Deserializer()
仍然会给出错误,将其更改为def test=new Deserializer()代码>(给定导入静态代码)。看起来是这样的。如果静态类具有零参数构造函数,则可以通过newInstance()
解决此问题:
我还没有测试过自己,但是您是否也尝试过在test.groovy
中显式地导入静态类,正如import static test.Vehicle.Deserializer
一样?@dmahapatro:import test.Vehicle.Deserializer
导致第二个指向该行的“无法解析类”错误<代码>导入静态测试.Vehicle.Deserializer
,奇怪的是,它不会导致第二个错误,但不会清除第一个错误。是的,同样的错误。在执行test.groovy
之前,我还试图通过groovyc
编译Vehicle.groovy
,但我仍然看到它在抱怨。这可能是一个问题。将test.groovy
与Vehicle.groovy
放在同一个包中,编译Vehicle.groovy
,然后运行groovy test.groovy
工作@德马哈帕特罗:我不知道“旁边”是什么意思。如果您的意思是“不在包中,比如我正在使用的测试
”,那么在我的情况下,这不是一个选项,这类似于我的工作脚本(问题中的最后一个代码片段)。
import test.Vehicle;
import static test.Vehicle.Deserializer;
def ok=new Vehicle();
def test=Deserializer.class.newInstance();
println "Hello, world!"