当前位置: 首页 > 知识库问答 >
问题:

Groovy调用泛型方法不编译

唐元凯
2023-03-14

我有Java8 Groovy 2.4.12和下面的代码编译和运行。

import java.util.function.Consumer
import groovy.transform.CompileStatic

@CompileStatic
class Bar {

    public static <T> void foo(T a, Consumer<T> c) { c.accept(a) }

    static void main(args) {
        ['a','b'].each {
            int xyz
            xyz = 1
            foo('') {
                println '1'
                return
            }
        }
    }
}

但是如果你注释掉< code>return,编译器会说

Groovy:[Static type checking] - Cannot call <T> Bar#foo(T, java.util.function.Consumer <T>) with arguments [java.lang.String, groovy.lang.Closure 

此外,如果您注释掉xyz值分配,那么它又可以了。因此,下面的代码编译并运行:

['a','b'].each {
    int xyz
//  xyz = 1
    foo('') {
        println '1'
    //  return
    }
}

这似乎是一种特殊情况,只有在以下情况下才会发生:

  • @CompileStatic注释
  • 具有两个参数的泛型方法;第一个是泛型类型,第二个是相同泛型类型的接口
  • 调用该泛型方法,第二个参数作为闭包,全部包装在另一个闭包中。
  • 调用前的变量声明和值赋值(如果在两行或单行上没有区别,如int xyz=1

我的问题是:;这是一个编译器错误吗?或者有合理的理由解释为什么它在没有return语句的情况下不能编译,而是用它编译?或者为什么添加变量定义会破坏它?

共有1个答案

吕征
2023-03-14

我的问题是;这是编译器错误还是有合理的原因为什么它在没有返回语句的情况下不编译而是用它编译?

前者。

 类似资料:
  • 我一直在尝试泛型,很快我就遇到了一些我无法解释的事情 例如: 我不明白

  • Groovy中的简单泛型类 Groovy版本: 这是我做的一个简单的测试用例,当一个更复杂的类不能编译时,错误是“不能将类型T的值赋给类型double[]的变量”。

  • 问题内容: 我遇到了一个涉及静态泛型方法的奇怪情况。这是代码: 我为什么不必在表达式中指定任何类型参数?这是某种类型推断吗?如果我想对此进行明确说明,如何指定类型参数? 问题答案: 是的,根据JLS第15.12.2.8节,这是基于分配目标的类型推断。明确地说,您可以这样称呼:

  • 本文向大家介绍groovy 调用方法,包括了groovy 调用方法的使用技巧和注意事项,需要的朋友参考一下 示例 请注意,如果在某些元素上不存在该方法,则在集合中混合类型时,groovy.lang.MissingMethodException可能会引发a:            

  • 问题内容: 没有静态成员可以使用类型参数,但是可以使用泛型类型参数调用静态成员吗​​?例如:- 这里的add()是一个静态方法。 在类似的主题上也有一些C#问题和答案,但是我不太确定如何在Java中使用它。 问题答案: 不,如果A是泛型类型,则无法执行。(Bozho对fast的回答是:),可能认为A是具体类型。 可行的方法如下。 但这可能不是您想要的。 阅读您的评论后,听起来您真正想要做的是: 您

  • 这怎么可能呢?为什么添加另一个参数会导致方法解析不明确?为什么在第一个例子中它可以区分供应商和对象,而在第二个例子中却不能? 编辑:这使用的是1.8.0_121。这是完整的错误消息: