在Groovy中,类型是可选的,因此您可以使用:
String foo = "foo"
foo.noSuchMethod()
或
def foo = "foo"
foo.noSuchMethod()
我假设第一个示例会生成编译时错误,而第二个示例只会在运行时失败。但是,情况似乎并非如此。根据我的经验,两种情况都不会产生编译时错误。
我是否正确地假设声明引用类型的唯一好处是作为一种文档形式,即将意图传达给其他程序员。例如,如果我写一个方法,如:
def capitalize(String arg) {
return arg.toUpperCase()
}
这比以下方式更有效地传递应该传递给函数的参数类型:
def capitalize(def arg) {
return arg.toUpperCase()
}
当指定类型时,Groovy编译器是否执行任何类型检查?
谢谢, 唐
答案 0 :(得分:3)
[编辑] 较新版本的Groovy允许编译时静态类型检查。使用此批注的代码比常规运行时Groovy更快,因为许多动态检查都被跳过。
正如Cesar所说,类型检查是一个运行时进程,这是Groovy比Java慢的主要原因之一(不是那个非常糟糕)。
你可以看出为什么会这样,对吧?鉴于Groovy的动态特性,几乎不可能判断String是否已经扩展到代码中的其他地方以包含方法noSuchMethod()。对于成员类型检查也是如此,因为完全可以删除一种类型的成员,并在代码中添加另一种类型的成员,其中同名。这可能不常见,但非常有可能。
问题是,您真正需要多少类型检查?你正在调用这个方法,你真的应该知道它需要什么参数,或者方法是否真的存在。使用编译时检查来节省查找时间并不是编译器的核心用途。
答案 1 :(得分:2)
在Groovy中,类型检查是在运行时动态完成的。类型变量的好处是你可以确定它包含你期望它们拥有的值,否则你会得到一个运行时异常,你可以抓住它并做你需要做的任何事情来处理异常。
答案 2 :(得分:2)
在Groovy中编译时间检查几乎不可能类型。
的例子String foo = "foo"
foo.noSuchMethod()
鉴于先前的指令是按照
的顺序执行的,所以会很好地工作String.metaClass.noSuchMethod { -> println "Yes there is such a method"}
答案 3 :(得分:1)
您可以指定类型的一个原因是允许IDE帮助您。
def foo
foo.[ctrl-space]
...对你不会有什么帮助
List foo
foo.[ctrl-space]
...可能(取决于IDE)可以选择List的方法。当然,由于其他答案中给出的原因,不是其中一种选择的方法可能是有效的方法。
还有其他自动化软件维护操作可以从类型的线索中受益。例如,重构。