Шанс для этой дыры в Groovy Staic типизации будет исправлен
Когда я запускаю следующий фрагмент 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)
}
Это не сработает и выдает исключение "Невозможно привести объект" 0,a "с классом" java.lang.String "к классу" java.lang.Number "". Проблема в том, что компилятор не жаловался. Я пробовал это в Scala и Kotlin (где inject называется fold), и соответствующий компилятор жалуется на несоответствие, как и ожидалось. Также аналог в 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 или это общая проблема из-за того, что статическая типизация введена позже в язык.
1 ответ
Я думаю (я не уверен на 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})
^