【问题标题】:Why does Groovy sometimes not require a return type (or even def) on methods?为什么 Groovy 有时不需要方法的返回类型(甚至定义)?
【发布时间】:2015-03-05 16:28:57
【问题描述】:

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

【问题讨论】:

  • @Opal:不,他们问的是完全不同的问题。如果您仔细阅读,您会发现该问题的 OP 使用 def 作为返回类型。在我的示例中,根本没有返回类型, 因此我的问题是为什么这段代码编译成功。
  • 能否提供一个可运行的示例来说明问题?
  • @Opal:添加到问题中。谢谢。
  • @olyv:也许我需要用不同的措辞来表达我的问题......但你真的应该能够看到这些问题与我的不同。您的第一个链接是关于可选的返回声明,这不是我要问的。根据您的第二个链接,如果您向上滚动,您会看到 Opal 已经链接到该链接,我指出这是一个完全不同的问题。我继续将我的问题标题更改为“为什么 Groovy 有时不需要方法的显式返回类型?”以防止混淆。

标签: groovy


【解决方案1】:

Groovy 被设计为灵活和宽容。只要您使用 def、返回类型、public 或注释,并且末尾有 ()(并且名称与封闭类不匹配),解释器就会发现它是一个方法声明并且它可以让你做到这一点。如果您不关心返回类型来表明它,Groovy 也可以不关心它。这就是设计理念。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2015-09-02
    • 2014-02-11
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多