Groovy AST 转换 - 如何确定 MethodCallExpression 的返回类型?

发布于 2024-10-08 06:04:34 字数 387 浏览 2 评论 0原文

使用 Groovy AST 转换,我如何找出返回类型MethodCallExpression

即使我在方法定义中显式定义了方法的返回类型,MethodCallExpression.getType() 也始终返回 java.lang.Object

With Groovy AST Transformations, how can I figure out the return type of a MethodCallExpression?

MethodCallExpression.getType() always returns java.lang.Object even if I explicitly define the return type of the method in the method definition.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

痴骨ら 2024-10-15 06:04:34

由于 groovy 的动态特性,AST 在编译时无法知道方法调用表达式的返回类型。例如:

class Example {
    String foo() { "foo" }
}
def e = new Example()
assert e.foo() == "foo"

看起来很简单。 foo 返回一个字符串,因此 e.foo() 的 MethodCallExpression 应该具有 String 类型,对吧?但是如果元类中的 foo 发生了变化怎么办?

class Example {
    String foo() { "foo" }
}
def e = new Example()
if (someRuntimeCondition) {
    e.metaClass.foo = { -> 42 }
}
assert e.foo() == "foo"  // is foo a String or an Int?

Groovy 编译器没有足够的信息来对方法调用做出任何假设,因为它可能在运行时发生变化,因此它必须将其编译为对象。

Due to the dynamic nature of groovy, the AST can't know the return type of a method call expression at compile time. For example:

class Example {
    String foo() { "foo" }
}
def e = new Example()
assert e.foo() == "foo"

Looks simple enough. foo returns a string, so the MethodCallExpression for e.foo() should have a type of String, right? But what if foo is changed in the metaClass?

class Example {
    String foo() { "foo" }
}
def e = new Example()
if (someRuntimeCondition) {
    e.metaClass.foo = { -> 42 }
}
assert e.foo() == "foo"  // is foo a String or an Int?

The groovy compiler just doesn't have enough information to make any assumptions about the method call since it could change at runtime, so it has to compile it down to an Object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文