You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (JIRA)" <ji...@apache.org> on 2017/09/24 13:38:00 UTC
[jira] [Commented] (GROOVY-8255) Odd problems with flow typing and
generics in Groovy 2.4.12+
[ https://issues.apache.org/jira/browse/GROOVY-8255?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16178199#comment-16178199 ]
Paul King commented on GROOVY-8255:
-----------------------------------
Standalone example:
{code}
@groovy.transform.CompileStatic
class Foo {
List<List<String>> items = [['x']]
def bar() {
def result = []
List<String> selections = items.get(0) ?: [] // ['y'] okay
for (String selection: selections) {
result << selection
}
result
}
}
assert new Foo().bar() == ['x']
// [Static type checking] - Incompatible generic argument types.
// Cannot assign java.util.List <? extends java.lang.Object>
// to: java.util.List <String>
{code}
> Odd problems with flow typing and generics in Groovy 2.4.12+
> ------------------------------------------------------------
>
> Key: GROOVY-8255
> URL: https://issues.apache.org/jira/browse/GROOVY-8255
> Project: Groovy
> Issue Type: Bug
> Components: Static Type Checker
> Affects Versions: 2.4.12
> Reporter: Graeme Rocher
>
> In order to get the GORM codebase to compile I had to make this change:
> https://github.com/grails/grails-data-mapping/commit/1ef850c496d13d8ca915b27e76b6bfdb4e27377e
> The code in question is:
> {code}
> /**
> * Sets multipart values within the request body
> *
> * @param name The name of the multipart
> * @param value The value of the multipart
> */
> void setProperty(String name, value) {
> if (value instanceof File) {
> value = new FileSystemResource(value)
> }
> else if (value instanceof URL) {
> value = new UrlResource(value)
> }
> else if (value instanceof InputStream) {
> value = new InputStreamResource(value)
> }
> else if (value instanceof GString) {
> value = value.toString()
> }
> if( mvm[name] ) {
> mvm[name].add value
> }
> else {
> mvm.put(name, [value]) // <--- FAILS COMPILATION HERE
> }
> }
> {code}
> No matter what I tried I could not get it into to compile. The method accepts `put(String, List<Object>)` but fails compilation with:
> {code}
> RequestCustomizer.groovy: 392: [Static type checking] - Cannot call org.springframework.util.MultiValueMap <String, Object>#put(java.lang.String, java.lang.Object) with arguments [java.lang.String, java.util.List <java.lang.String>]
> @ line 392, column 13.
> mvm.put(name, [value])
> ^
> {code}
> Altering the code to:
> {code}
> List<Object> values = [value]
> mvm.put(name, values)
> {code}
> Fails with:
> {code}
> RequestCustomizer.groovy: 392: [Static type checking] - Incompatible generic argument types. Cannot assign java.util.List <java.lang.String> to: java.util.List <Object>
> @ line 392, column 35.
> List<Object> values = [value]
> ^
> RequestCustomizer.groovy: 393: [Static type checking] - Cannot call org.springframework.util.MultiValueMap <String, Object>#put(java.lang.String, java.lang.Object) with arguments [java.lang.String, java.util.List <java.lang.String>]
> @ line 393, column 13.
> mvm.put(name, values)
> ^
> 2 errors
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)