对于下面的两个代码块,我在问"为什么在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或返回类型。