为什么Groovy有时不需要方法的返回类型(甚至def)?

为什么Groovy有时不需要方法的返回类型(甚至def)?,groovy,Groovy,对于下面的两个代码块,我会问“为什么Groovy中会出现这种情况?”。也许我应该提出两个独立的问题,但它们似乎密切相关 首先, class Dog { public speak() { return "Bark" } } 注意speak()没有返回类型,我也没有说def。然而,代码的工作原理就好像我包含了def 第二, @interface MyAnnotation { } interface Canine{ @MyAnnotation sp

对于下面的两个代码块,我会问“为什么Groovy中会出现这种情况?”。也许我应该提出两个独立的问题,但它们似乎密切相关

首先,

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有时不需要方法上的显式返回类型?”。