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 { } }

我有以下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 {
  }
}
但是,以下命令失败:

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!"