如何在Trait中使用@ClosureParams引用实现类?
如何在Groovy Trait方法中用@ClosureParams指定闭包参数类型
要让静态分析器识别闭包中it的实际类型为Bar,你需要使用@ClosureParams配合FromInstanceContext类型。这个注解会告诉分析器从调用foo方法的实例上下文里获取闭包参数的类型——也就是调用foo的Bar实例本身。
具体的写法如下:
首先引入对应的注解类,然后在foo方法的闭包参数上添加注解:
import groovy.transform.stc.ClosureParams import groovy.transform.stc.FromInstanceContext trait Fooable { void foo(@ClosureParams(FromInstanceContext.class) Closure callable) { callable.call(this) } } class Bar implements Fooable { String baz } new Bar().foo { // 现在静态分析器会正确识别it是Bar类型,能正常提示baz属性 it.baz == "foo'ed" }
为什么这个方案有效?
FromInstanceContext是Groovy静态类型检查注解的一部分,它的作用是获取调用当前方法的对象的实际类型。在你的场景里,调用foo的是Bar实例,所以静态分析器会自动推断出闭包参数it的类型是Bar,而不仅仅是TraitFooable的类型,这样就能提供准确的代码提示和静态检查支持。
如果用SimpleType指定Fooable作为类型,虽然语法合法,但只能识别it为Fooable类型,无法访问Bar特有的baz属性的提示,显然不符合你的需求。
内容的提问来源于stack exchange,提问作者Egil Hansen
相关产品推荐
相关产品推荐

