2016-11-29 91 views
2

我有以下Groovy脚本为test.groovy的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报告2.4.7 )

我期望它成功并打印出“Hello,world”。相反,我得到:

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文件?


更新:我发现this issue,并可以确认的Groovy至少可以有点看Deserializer类:

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();(给定import static)。

+0

我没有测试过自己,但你试过导入静态类明确,以及在'test.groovy'为'进口静态测试.Vehicle.Deserializer'? – dmahapatro

+0

@dmahapatro:'import test.Vehicle.Deserializer'导致第二个“无法解析类”错误,指向该行。 '输入静态test.Vehicle.Deserializer',奇怪的是,*不会*导致第二个错误,但它不会清除第一个错误。 – CommonsWare

+0

是的,目击者也一样。在执行'test.groovy'之前,我还试图通过'groovyc'编译'Vehicle.groovy',但我仍然看到它抱怨。这可能是一个问题。 – dmahapatro

回答

1

看起来这是a known Groovy bug。如果您的静态类有一个零参数的构造函数,你可以通过newInstance()解决此问题:

import test.Vehicle; 
import static test.Vehicle.Deserializer; 

def ok=new Vehicle(); 
def test=Deserializer.class.newInstance(); 

println "Hello, world!"