为什么Groovy有时不需要方法的返回类型(甚至def)?
对于下面的两个代码块,我会问“为什么Groovy中会出现这种情况?”。也许我应该提出两个独立的问题,但它们似乎密切相关 首先,为什么Groovy有时不需要方法的返回类型(甚至def)?,groovy,Groovy,对于下面的两个代码块,我会问“为什么Groovy中会出现这种情况?”。也许我应该提出两个独立的问题,但它们似乎密切相关 首先, class Dog { public speak() { return "Bark" } } 注意speak()没有返回类型,我也没有说def。然而,代码的工作原理就好像我包含了def 第二, @interface MyAnnotation { } interface Canine{ @MyAnnotation sp
class Dog
{
public speak() {
return "Bark"
}
}
注意speak()
没有返回类型,我也没有说def
。然而,代码的工作原理就好像我包含了def
第二,
@interface MyAnnotation {
}
interface Canine{
@MyAnnotation
speak()
}
请注意speak()
方法没有返回类型,但是当我在方法上添加注释时,它可以工作
为什么这两个代码块都能工作(即使用它们时没有错误)?为什么第一个在我把public
放在它前面时起作用,而第二个在我把注释放在它上面时起作用?这些记录在哪里
编辑:
下面是一个可运行的脚本,它演示了这两个奇怪之处:
@interface MyAnnotation { }
interface Canine{
@MyAnnotation
speak()
}
class Dog implements Canine
{
public speak() {
return "Bark"
}
}
Dog fido = new Dog()
println fido.speak()
Groovy的设计是灵活和允许的。只要您使用def、返回类型、public或注释,并且在末尾有
()
(名称与封闭类不匹配),解释器就会发现这是一个方法声明,并允许您这样做。如果您对返回类型的关注程度不够,无法指出它,那么Groovy也可以不关注它。这就是设计理念
这种语法在我能找到的任何地方都没有记录。我猜这表明这种语法可能会发生变化。如果只是为了清楚起见,我会犹豫是否依赖它,并坚持使用def或返回类型 可能是@Opal的复制品:不,他们在问一个完全不同的问题。如果仔细阅读,您会发现该问题的OP使用了返回类型的
def
。在我的示例中,根本没有返回类型,因此我的问题是为什么这段代码能够成功编译。能否提供一个可运行的示例来说明这个问题?@Opal:添加到问题中。谢谢。@olyv:也许我需要用不同的词来表达我的问题……但你真的应该能够看到这些问题与我的不同。您的第一个链接是关于可选的return语句,这不是我要问的。根据你的第二个链接,如果你向上滚动,你会看到蛋白石已经链接到了,我指出这是一个完全不同的问题。为了避免混淆,我将问题标题改为“为什么Groovy有时不需要方法上的显式返回类型?”。