OlliP
OlliP

Reputation: 1585

Chance for this hole in Groovy staic typing to be fixed

When I run the following Groovy snippet, it prints ",a,b,c" as expected:

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

Now I change the first parameter in inject from an empty string to the number 0:

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

This won't work an produces an exception "Cannot cast object '0,a' with class 'java.lang.String' to class 'java.lang.Number'". Problem is that the compiler did not complain. I tried this in Scala and Kotlin (where inject is called fold) an the respective compiler complains about the mismatch as expected. Also the counterpart in Java8 does not compile (it says found int, required: 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);

Question is now whether this can be fixed in Groovy or whether this is a a general problem because of static typing being introduced later into the language.

Upvotes: 2

Views: 130

Answers (1)

Sergey Tselovalnikov
Sergey Tselovalnikov

Reputation: 6036

I think (I'm not 100% sure) that it is a bug in Groovy, very probably somewhere in type inference, and it can be fixed. Try to fill an issue in the bug tracker.

If you want to see compilation error, you can give types to closure parameters

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

Gives an error:

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})
                                 ^

Upvotes: 3

Related Questions