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

时间:2015-03-05 16:28:58

标签: groovy

我在问"为什么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()

1 个答案:

答案 0 :(得分:1)

Groovy旨在灵活和宽容。只要您使用def,返回类型,公共或注释,并且最后有()(并且名称与封闭类不匹配),解释器会发现它是一种方法声明,它让你做到这一点。如果你不关心返回类型足以表明它,Groovy也没关系它。这就是设计理念。

在我找到的任何地方都没有记录此语法。我猜这表明这种语法可能会发生变化。如果仅为了清楚起见,我会毫不犹豫地依赖于此并坚持使用def或返回类型。