[ https://issues.apache.org/jira/browse/GROOVY-9064?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16812172#comment-16812172 ]
Mauro Molinari edited comment on GROOVY-9064 at 4/8/19 7:15 AM: ---------------------------------------------------------------- Making the compilation fail at: {code:java} List<Object[]> rows = getSomeRows() {code} would make more sense IMHO. But if we assume that this doesn't fail because Groovy is smart enough to trust you that the returned {{List}} is actually a {{List<Object[]>}} and save you from typing: {code:java} @SuppressWarnings('unchecked') List<Object[]> rows = (List<Object[]) getSomeRows() {code} then the requirement to add the cast anyway, not to make the compiler happy at the assignment place, but rather to make the compiler happy within the {{each}} closure body (to convince it that {{rows}} contains {{Object[]}} instances), just because the {{rows}} declaration type is indeed completely ignored, well this sounds counter intuitive to me. was (Author: mauromol): Making the compilation fail at: {code:java} List<Object[]> rows = getSomeRows() {code} would make more sense IMHO. But if we assume that this doesn't fail because Groovy is smart enough to trust you that the returned {{List}} is actually a {{List<Object[]>}} and save you from typing: {code:java} List<Object[]> rows = (List<Object[]) getSomeRows() {code} then the requirement to add the cast anyway not to make the compiler happy at the assignment place, but rather to make the compiler happy within the {{each}} closure body (to convince it that {{rows}} contains {{Object[]}} instances), just because the {{rows}} declaration type is indeed completely ignored, well this sounds counter intuitive to me. > STC: explicit declared variable type ignored in favor of assigned value > type(s) > ------------------------------------------------------------------------------- > > Key: GROOVY-9064 > URL: https://issues.apache.org/jira/browse/GROOVY-9064 > Project: Groovy > Issue Type: Improvement > Reporter: Eric Milles > Priority: Major > > Follow up to GROOVY-9058. Consider the following: > {code:groovy} > List getSomeRows() { ... } > @groovy.transform.CompileStatic > void meth() { > List<Object[]> rows = getSomeRows() > rows.each { row -> > def col = row[0] > } > } > {code} > The inferred type of {{rows}} is {{List}} and not {{List<Object[]>}} even > though the assignment cleared type checking. This causes the inferred type > of {{row}} to be {{Object}} instead of {{Object[]}}. > Similarly, {{List<String> list = []}} infers as {{ArrayList<String>}} instead > of the explicit declared type, and {{Map<String, ?> map = [:]}} infers to > {{LinkedHasMap<...>}} instead of the declared type. In general, I think as > long as the assignment is compatible, the variable should retain its > explicitly declared type regardless of assignments. -- This message was sent by Atlassian JIRA (v7.6.3#76005)