执行groovy脚本时出错

执行groovy脚本时出错,groovy,groovy-console,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 Acti

代码如下:

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执行is时,我得到以下编译错误

1编译错误:


类目簿的重复类定义无效:源 groovy至少包含类Book的两个定义。一个 类的类型是使用该类显式生成的类 语句,另一个是基于脚本体生成的类 在文件名上。解决方案是更改文件名或 类名。在第1行,第1列

谁能给我解释一下这里发生了什么事

  • Groovy控制台在内部缓冲项(源、类、变量),第二次单击“run”可能与第一次不同,我同意。几乎所有解释器窗口(任何语言)都有类似的行为
  • 在从文件打开、粘贴到没有文件的窗口时存在微妙的差异,因此可能会有名称簿或控制台脚本1等(“Groovy的过程性”使用隐藏了“对象”背景、隐藏/默认/从文件生成的类名等)
  • 这可以通过即席编程(脚本模式)得到充分的帮助,但并不总是最适合真正的OOP


    PS.代码也几乎没有错误

    类目簿的无效重复类目定义:

    OP的代码列表包含两部分:

  • 类书的类型定义
  • 充当Book类型客户机的groovy脚本
  • Groovy将*.Groovy文件视为脚本文件或类定义文件。脚本文件是包含不在类定义内的代码的文件。当Groovy编译脚本文件时,它隐式地创建一个类来保存代码,并且隐式类的名称为Book.Groovy文件

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

    比较:


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

    我尝试将文件名从Book.groovy更改为Book-Program.groovy,但仍然会出现如下错误。抛出异常java.lang.ClassFormatError:类文件Book程序$getTitleBackwards中的非法类名“Book程序$getTitleBackwards”将文件名更改为foo.groovy之类的名称,它就会工作。
    String getTitleBackwards(Book)
    也应该是
    String getTitleBackwards(Book)