You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (Jira)" <ji...@apache.org> on 2021/04/25 00:11:00 UTC

[jira] [Commented] (GROOVY-10056) Inferred parameter type of lambda expression for multi-dimensions array is not correct

    [ https://issues.apache.org/jira/browse/GROOVY-10056?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17331341#comment-17331341 ] 

Daniel Sun commented on GROOVY-10056:
-------------------------------------

The following check for varargs is not correct when the last argument type is array:
{code:java}
boolean isVargs = isVargs(parameters);
{code}
([https://github.com/apache/groovy/blob/master/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java#L5286])

FYI, [https://github.com/apache/groovy/pull/1570]

> Inferred parameter type of lambda expression for multi-dimensions array is not correct
> --------------------------------------------------------------------------------------
>
>                 Key: GROOVY-10056
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10056
>             Project: Groovy
>          Issue Type: Bug
>          Components: Static compilation, Static Type Checker
>    Affects Versions: 4.0.0-alpha-3
>            Reporter: Daniel Sun
>            Assignee: Eric Milles
>            Priority: Major
>          Time Spent: 1.5h
>  Remaining Estimate: 0h
>
> The type of {{strs}} is inferred as {{String}}, but its type should be {{String[]}}
> {code:java}
> @groovy.transform.CompileStatic
> def test() {
>     String[][] strsArray = new String[][] {
>         new String[] {'a', 'b', 'c'},
>         new String[] {'d', 'e', 'f'}
>     }
>     Arrays.stream(strsArray)
>                 .limit(1)
>                 .forEach(strs -> {
>                     assert ['a', 'b', 'c'] == Arrays.asList(strs)
>                 })
> }
> test()
> {code}
> *Error message*
> {code:java}
> java.lang.ClassCastException: class [Ljava.lang.String; cannot be cast to class java.lang.String ([Ljava.lang.String; and java.lang.String are in module java.base of loader 'bootstrap')
> 	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
> 	at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:199)
> 	at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
> 	at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
> 	at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
> 	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
> 	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
> 	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
> 	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
> 	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
> 	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
> 	at ConsoleScript3.test(ConsoleScript3:7)
> 	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
> 	at ConsoleScript3.run(ConsoleScript3:13)
> 	at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:257)
> 	at groovy.lang.GroovyShell.run(GroovyShell.java:363)
> 	at groovy.lang.GroovyShell.run(GroovyShell.java:342)
> 	at groovy.lang.GroovyShell.run(GroovyShell.java:168)
> 	at groovy.console.ui.Console$GroovySourceType.run(Console.groovy:1177)
> 	at groovy.console.ui.Console.doRun(Console.groovy:1408)
> 	at jdk.internal.reflect.GeneratedMethodAccessor81.invoke(Unknown Source)
> 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> 	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:112)
> 	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
> 	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:331)
> 	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:63)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:203)
> 	at groovy.console.ui.Console$_runScriptImpl_closure23.doCall(Console.groovy:1372)
> 	at groovy.console.ui.Console$_runScriptImpl_closure23.doCall(Console.groovy)
> 	at jdk.internal.reflect.GeneratedMethodAccessor78.invoke(Unknown Source)
> 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> 	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:112)
> 	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
> 	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:268)
> 	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
> 	at groovy.lang.Closure.call(Closure.java:419)
> 	at groovy.lang.Closure.call(Closure.java:413)
> 	at groovy.lang.Closure.run(Closure.java:501)
> 	at java.base/java.lang.Thread.run(Thread.java:834)
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)