Шанс для этой дыры в 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})
                                 ^
Другие вопросы по тегам