gpt4 book ai didi

groovy - 有没有一种干净的方法可以在 Groovy 中指定 Closure 参数类型?

转载 作者:行者123 更新时间:2023-12-04 21:28:51 25 4
gpt4 key购买 nike

我知道 @ClosureParams注解。不过,它似乎只涵盖更复杂的用例。我正在寻找类似 described here 的东西在注释闭包部分。这类似于以下代码段:

void doSomething(MyType src, @ClosureParams(MyType) Closure cl) { ... }

不幸的是,此示例不再使用更新的 groovy 版本进行编译(目前我使用的是 2.5.8)。我知道我可以通过以下方式实现:
void doSomething(MyType src, @ClosureParams(FirstParam) Closure cl) { ... }

我的用例除了闭包本身没有任何其他参数:
void doSomething(@ClosureParams(/* how? */) Closure cl) { ... }

我可以破解它:
void doSomething(@ClosureParams(SecondParam) Closure cl, MyType ignore = null) { ... }

它远不干净,不是吗?

我也可以去:
void doSomething(@ClosureParams(value = SimpleType, options = ['com.somepackage.MyType']) Closure cl) { ... }

它不仅丑陋且嘈杂,而且将类型指定为字符串会阻止某些 IDE 功能工作。例如 MyType此处不会选择重构重命名或搜索用法。

我想,没有任何更简洁的方法可以实现这一点,因此可以将类型指定为类型而不是字符串并且没有额外的不必要的参数,是吗?

像 Cédric Champeau 在上面链接的博客文章中最初发布的内容将是理想的。在我的情况下,它看起来像:
void doSomething(@ClosureParams(MyType) Closure cl) { ... }

最佳答案

您可能需要考虑 FromAbstractTypeMethods签名提示而不是 SimpleType .它使用起来非常冗长,但它为您提供了 SimpleType 所没有的好处。提示类 - 您可以轻松重构签名类中定义的类型,也可以找到签名提示中使用的类的用法。主要的缺点是您需要为每个闭包签名提示创建额外的抽象类,并且需要将包含签名作为抽象方法的类的名称定义为常量字符串(SimpleType 签名提示存在相同的问题。 ) 但是,您会得到一个参数 doSomething方法,不添加第二个 null参数只是为了能够使用SecondParam签名提示。

package com.example

import groovy.transform.Immutable
import groovy.transform.stc.ClosureParams
import groovy.transform.stc.FromAbstractTypeMethods

class MyClass {
static void doSomething(@ClosureParams(value = FromAbstractTypeMethods, options = ["com.example.MySignatures"]) Closure cl) {
cl.call()
}

static void main(String[] args) {
doSomething {
println it.name
}
}
}

@Immutable
class MyType {
String name
int x
int y
}

abstract class MySignatures {
abstract void firstSignature(MyType myType)
abstract void secondSignature(MyType myType, String str)
}

enter image description here

我猜简单干净 @ClosureParams(String)删除了变体以满足其他更复杂的用例。 ClosureParamsAPI注释是固定的,它限制了 options到字符串数组。也许可以通过实现自己的 ClosureSignatureHint 来实现- 几个月前我已经尝试过,但我无法让 IntelliJ IDEA 使用我的自定义类来提供签名提示。

关于groovy - 有没有一种干净的方法可以在 Groovy 中指定 Closure 参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641882/

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