为什么 Groovy 有时不需要方法上的 return 类型(甚至 def)?
Why does Groovy sometimes not require a return type (or even def) on methods?
我要求 "why is this possible in Groovy?" 以下两个代码块。也许我应该创建两个单独的问题,但它们似乎密切相关。
首先,
class Dog
{
public speak() {
return "Bark"
}
}
请注意 speak()
没有 return 类型,而且我没有说 def
。然而,代码的工作方式就好像我包含了 def
。
其次,
@interface MyAnnotation {
}
interface Canine{
@MyAnnotation
speak()
}
请注意 speak()
方法没有 return 类型,但是当我在该方法上添加注释时它会起作用。
为什么这两个代码块都有效(即,我使用它们时没有错误)?为什么第一个有效,如果我把 public
放在它前面,为什么第二个有效,如果我在上面加注解?这记录在哪里?
编辑:
这是一个可运行的脚本,它展示了这两个奇怪的地方:
@interface MyAnnotation { }
interface Canine{
@MyAnnotation
speak()
}
class Dog implements Canine
{
public speak() {
return "Bark"
}
}
Dog fido = new Dog()
println fido.speak()
Groovy 被设计为灵活和宽松的。只要您使用 def、return 类型、public 或注释,并且末尾有 ()
(并且名称与封闭的 class), 解释器发现它是一个方法声明并且它允许你这样做。如果您不关心 return 类型足以表明它, Groovy 也可以不关心它。这就是设计理念。
在我能找到的任何地方都没有记录这种语法。我猜想这表明此语法可能会发生变化。如果只是为了清楚起见,我会犹豫是否依赖它并坚持使用 def 或 return 类型。
我要求 "why is this possible in Groovy?" 以下两个代码块。也许我应该创建两个单独的问题,但它们似乎密切相关。
首先,
class Dog
{
public speak() {
return "Bark"
}
}
请注意 speak()
没有 return 类型,而且我没有说 def
。然而,代码的工作方式就好像我包含了 def
。
其次,
@interface MyAnnotation {
}
interface Canine{
@MyAnnotation
speak()
}
请注意 speak()
方法没有 return 类型,但是当我在该方法上添加注释时它会起作用。
为什么这两个代码块都有效(即,我使用它们时没有错误)?为什么第一个有效,如果我把 public
放在它前面,为什么第二个有效,如果我在上面加注解?这记录在哪里?
编辑:
这是一个可运行的脚本,它展示了这两个奇怪的地方:
@interface MyAnnotation { }
interface Canine{
@MyAnnotation
speak()
}
class Dog implements Canine
{
public speak() {
return "Bark"
}
}
Dog fido = new Dog()
println fido.speak()
Groovy 被设计为灵活和宽松的。只要您使用 def、return 类型、public 或注释,并且末尾有 ()
(并且名称与封闭的 class), 解释器发现它是一个方法声明并且它允许你这样做。如果您不关心 return 类型足以表明它, Groovy 也可以不关心它。这就是设计理念。
在我能找到的任何地方都没有记录这种语法。我猜想这表明此语法可能会发生变化。如果只是为了清楚起见,我会犹豫是否依赖它并坚持使用 def 或 return 类型。