执行groovy脚本时出错

时间:2015-07-20 07:48:16

标签: groovy groovy-console

代码如下:

class Book
{
     private String title
     Book (String theTitle)
     {
         title=theTitle
     }
     String getTitle()
     {
         return title
     }
}
Book gina=new Book('Groovy in Action')
assert gina.getTitle()=='Groovy in Action'
assert getTitleBackwards(gina)=='noitcA ni yvoorG'
String getTitleBackwards(Book)
{
    title=book.getTitle()
    return title.reverse()
}

当我使用Ctrl + R执行时,我收到以下编译错误。

1编译错误:

  

类Book的重复类定义无效:源   Book.groovy包含至少两个类Book的定义。一   这些类是使用该类的显式生成类   声明,另一个是从脚本体生成的类   在文件名上。解决方案是更改文件名或更改   班级名称。 at line:1,column:1

有人可以解释一下这里发生了什么。

2 个答案:

答案 0 :(得分:5)

类Book的重复类定义无效:

OP的代码清单包含两部分:

  1. 类Book
  2. 的类型定义
  3. 一个groovy脚本,充当Book类型的客户端
  4. Groovy将您的* .groovy文件视为脚本文件或类定义文件。脚本文件是包含不在类定义中的代码的文件。当Groovy编译脚本文件时,它会隐式创建一个类来保存您的代码,而隐式类将被赋予Book.groovy文件的名称。

    然后,编译器将尝试为groovy脚本中定义的Book类创建一个额外的类Book,这里发生错误,因为现在实际上有两个Book类定义。

    比较:Blog entry with code sample for this error message

    在同一文件中定义Book类和客户端脚本的方法是重命名文件,例如:到BookApp.groovy。警告:如果你这样做,Book类型只能在脚本文件中引用,即使在类路径上找到* .groovy文件,groovy也不会自动找到Book类型。

答案 1 :(得分:0)

  1. Groovy控制台在内部缓冲项目(源,类,变量),第二次单击"运行"可能与众不同,我同意。几乎所有的解释器窗口(使用任何语言)都有类似的行为
  2. 在从File打开时有微妙的差异,粘贴到没有文件的窗口,因此可以有名称Book或ConsoleScript1等("程序"使用Groovy已隐藏"对象"背景,隐藏/默认/从文件中生成的类名等)
  3. 这可以通过临时编程(脚本模式)来完成,但并不总是最适合真正的OOP。

    PS。代码也有很少的错误