当我运行以下 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 中修复,或者这是否是一个普遍的问题,因为稍后将静态类型引入该语言。