8

代码如下:

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 的至少两个定义。其中一个类是使用 class 语句显式生成的类,另一个是根据文件名从脚本主体生成的类。解决方案是更改文件名或更改类名。在行:1,列:1

谁能解释一下这里发生了什么。

4

3 回答 3

9

类 Book 的重复类定义无效:

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

  1. Book类的类型定义
  2. 充当 Book 类型客户端的 groovy 脚本

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

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

比较:博客条目与此错误消息的代码示例

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

于 2018-01-21T15:11:19.303 回答
1
  1. Groovy 控制台在内部缓冲项目(源、类、变量),第二次单击“运行”可能与第一次不同,我同意。几乎所有解释器窗口(任何语言)都有类似的行为
  2. 从文件打开时有微妙的差异,粘贴到没有文件的窗口,因此可以有名称 Book 或 ConsoleScript1 等(Groovy 的“程序”使用隐藏了“对象”背景,隐藏/默认/从文件中生成的类名等)

这可以通过临时编程(脚本模式)提供帮助,但并不总是最适合真正的 OOP。

PS。代码也很少有错误

于 2015-09-09T12:37:38.947 回答
0

当我遇到这个错误时,是因为我忘记了上面的“导入”这个词,而不是:

import io.beapi.api.service.PrincipleService

@RestController
class UserController {

我有这个:

io.beapi.api.service.PrincipleService

@RestController
class UserController {

缺少导入这个词给我造成了这个问题。快速简单的修复(一旦我发现它是什么):)

于 2022-01-15T22:27:58.693 回答