有人可以解释@TypeChecked和@CompileStatic之间的区别吗?
我用@TypeChecked读到了它,无法在运行时添加新方法。 还有哪些其他功能不允许?
@CompileStatic允许哪些Groovy功能? 与groovyc和@CompileStatic相比,字节码是否与使用javac编译的相同?
答案 0 :(得分:38)
主要区别在于MOP(元对象协议):@TypeChecked
保持方法通过MOP,而@CompileStatic
生成类似于Java的字节码的方法调用。这意味着它们的语义不同,但这也意味着您仍然可以在@TypeChecked
代码之上应用元编程,只要方法调用可以在编译时解析。
以下代码显示了代理@TypeChecked
代码的MOP,而不代表@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,除了少数例外。
(2016-01-13更新)
@CompileStatic
和@TypeChecked
都允许:
@DelegatesTo
的闭幕授权); 对于@TypeChecked
,您还可以指示编译器通过Type Checking Extensions忽略某些类型检查,从而提供更大的灵活性。 @CompileStatic
也支持此功能,但是little more restrictive。
答案 1 :(得分:5)
TL / DR;
@TypeChecked
的行为相同@TypeChecked
,但也会在运行时将代码修改为类型安全,这意味着使用动态编程的方法会中断。