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



对于下面的两个代码块,我在问"为什么在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或annotation,并且末尾有()(并且名称与封闭类不匹配),解释器就会发现这是一个方法声明,并允许您这样做。如果您不关心返回类型来指示它,Groovy也可以不关心它。这就是设计理念。

这个语法在我能找到的任何地方都没有文档。我想这表明这种语法可能会发生变化。如果只是为了清楚起见,我会犹豫是否依赖它,并坚持使用def或返回类型。

最新更新