为什么 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 类型。