我在 Java 中有以下方法:
public void myMethod(
@ClosureParams(
value = SimpleType.class,
options = {
"java.util.Map"
}
) Closure<String> closure
) {
...
}
它必须@ClosureParams为 IDEA 中的静态类型检查器和类型推断指定闭包的参数类型。
在 Groovy 脚本中,我按如下方式调用此方法:
myMethod { Map<String, Object> doc ->
...
}它工作正常。但是当我尝试在我的 java 方法中为闭包指定泛型类型时:java.util.Map
public void myMethod(
@ClosureParams(
value = SimpleType.class,
options = {
"java.util.Map<java.lang.String,java.lang.Object>" // <-- added here
}
) Closure<String> closure
) {
...
}
groovy 的静态类型检查器失败并出现错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
C:\myproject\script.groovy: 1: Expected parameter of type java.util.Map<java.lang.String,java.lang.Object> but got java.util.Map <String, Object>
@ line 1, column 8.
myMethod { Map<String, Object> doc ->
doc尽管 IDEA在没有任何提示Map或Map<...>使用提示的情况下推断出类型@ClosureParams。
当我查看groovy.transform.stc.SimpleType类的源代码时,我发现这个类没有提供指定泛型类型的能力,因为它使用 plain Class.forName:
public class SimpleType extends SingleSignatureClosureHint {
@Override
public ClassNode[] getParameterTypes(final MethodNode node, final String[] options, final SourceUnit sourceUnit, final CompilationUnit unit, final ASTNode usage) {
ClassNode[] result = new ClassNode[options.length];
for (int i = 0; i < result.length; i++) {
result[i] = findClassNode(sourceUnit, unit, options[i]);
}
return result;
}
}
我的问题:如何在 groovy 中使用泛型指定闭包参数类型?最好有 IDEA 的支持。
哈士奇WWW
相关分类