gpt4 book ai didi

groovy - @TypeChecked 和 @CompileStatic 之间的区别

转载 作者:行者123 更新时间:2023-12-03 08:40:00 25 4
gpt4 key购买 nike

有人可以解释@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 年 1 月 13 日更新)

两个 @CompileStatic@TypeChecked会允许:
  • 闭包(包括通过 @DelegatesTo 进行的闭包委托(delegate));
  • AST(可用于 compile-time metaprogramming );
  • Groovy 的语法糖,如正则表达式、列表、映射、运算符重载等;
  • Extensions .

  • 对于 @TypeChecked ,您还可以通过 Type Checking Extensions 指示编译器忽略某些类型检查。 ,允许更大的灵 active 。 @CompileStatic也支持这个,但是是 little more restrictive .

    关于groovy - @TypeChecked 和 @CompileStatic 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20030026/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com