有人可以解释@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));
  • AST(可用于compile-time metaprogramming);
  • Groovy的语法糖,例如正则表达式,列表, map ,运算符重载等。
  • Extensions

  • 对于@TypeChecked,您还可以指示编译器通过Type Checking Extensions忽略某些类型检查,从而提供更大的灵活性。 @CompileStatic也支持此功能,但它是little more restrictive

    10-06 03:46