有人可以解释@TypeChecked和@CompileStatic之间的区别吗?
我读到@TypeChecked,无法在运行时添加新方法。
不允许使用哪些其他功能?
@CompileStatic允许使用哪些Groovy功能?
与groovyc和@CompileStatic相比,字节码与用javac编译的字节码是否相同?
最佳答案
主要区别在于MOP(元对象协议(protocol)):@TypeChecked
保持方法通过MOP,而@CompileStatic
生成类似于Java字节码的方法调用。这意味着它们的语义是不同的,但是这也意味着,只要可以在编译时解决方法调用,您仍然可以在@TypeChecked
代码之上应用元编程。
以下代码显示了MOP对@TypeChecked
代码起作用,而不对@CompileStatic
代码起作用:
import groovy.transform.CompileStatic as CS
import groovy.transform.TypeChecked as TC
class Foo {
def bar = "bar"
}
class TestTC {
Foo foo
TestTC() {
foo = new Foo()
foo.metaClass.getBar = { "metaClass'd bar" }
}
@TC
def typed() {
foo.bar
}
@CS
def compiled() {
foo.bar
}
}
assert new TestTC().typed() == "metaClass'd bar"
assert new TestTC().compiled() == "bar"
对于
@CompileStatic
,是的,Groovy尝试生成与javac
将输出的字节码(即their performance are very close)接近的字节码,但有一些异常(exception)。(更新2016-01-13)
@CompileStatic
和@TypeChecked
都将允许:@DelegatesTo
的闭包委托(delegate)); 对于
@TypeChecked
,您还可以指示编译器通过Type Checking Extensions忽略某些类型检查,从而提供更大的灵活性。 @CompileStatic
也支持此功能,但它是little more restrictive。