2

当我运行以下 Groovy 代码片段时,它会按预期打印“,a,b,c”:

@CompileStatic
public static void main(String[] args) {
    def inList = ["a", "b", "c"]
    def outList = inList.inject("", { a, b -> a + "," + b })
    println(outList)
}

现在我将 inject 中的第一个参数从空字符串更改为数字 0:

@CompileStatic
public static void main(String[] args) {
    def inList = ["a", "b", "c"]
    def outList = inList.inject(0, { a, b -> a + "," + b })
    println(outList)
}

这将不起作用并产生异常“无法将具有类'java.lang.String'的对象'0,a'转换为类'java.lang.Number'”。问题是编译器没有抱怨。我在 Scala 和 Kotlin(其中注入称为折叠)中尝试了这个,相应的编译器按预期抱怨不匹配。Java8中的对应物也无法编译(它说找到int,需要:java.lang.String):

List<String> list = Arrays.asList("a", "b", "c");
Object obj = list.stream().reduce(0, (x, y) -> x + y);
System.out.println(obj);

现在的问题是这是否可以在 Groovy 中修复,或者这是否是一个普遍的问题,因为稍后将静态类型引入该语言。

4

1 回答 1

3

我认为(我不是 100% 确定)这是 Groovy 中的一个错误,很可能是类型推断中的某个地方,并且可以修复。尝试在错误跟踪器中填写问题

如果你想查看编译错误,你可以给闭包参数指定类型

inList.inject(0, { String a, String b -> a + "," + b })

给出一个错误:

Expected parameter of type java.lang.Integer but got java.lang.String
 @ line 7, column 38.
def outList = inList.inject(0, { String a, String b -> a + "," + b})
                                 ^
于 2016-09-12T08:47:17.403 回答