Quantcast

[jira] [Comment Edited] (GROOVY-8123) Wrong invokation target of static method

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[jira] [Comment Edited] (GROOVY-8123) Wrong invokation target of static method

JIRA jira@apache.org

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

Lóránt Pintér edited comment on GROOVY-8123 at 4/18/17 2:47 PM:
----------------------------------------------------------------

This is a problem for whoever uses Guava's immutable collections from Groovy. Methods like {{ImmutableSortedSet.of()}} get mixed up with {{Set.of()}} introduced in Java 9.

For example, we needed to do this fix in Gradle: https://github.com/gradle/gradle/commit/c46bf3ed6e529f46df60bbcb457b8ff27d4fef5e


was (Author: lptr):
This is a problem for whoever uses Guava's immutable collections from Groovy. Methods like `ImmutableSortedSet.of()` get mixed up with `Set.of()` introduced in Java 9.

For example, we needed to do this fix in Gradle: https://github.com/gradle/gradle/commit/c46bf3ed6e529f46df60bbcb457b8ff27d4fef5e

> Wrong invokation target of static method
> ----------------------------------------
>
>                 Key: GROOVY-8123
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8123
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.4.9
>            Reporter: Jędrzej Dąbrowa
>
> Given following set of java classes:
> {code:title=Interface.java|borderStyle=solid}
> public interface Interface {
>     class ExternalInterface implements Interface {}
>     static Interface provide() {
>         new Throwable().printStackTrace();
>         return new ExternalInterface();
>     }
> }
> {code}
> {code:title=MyInterface.java|borderStyle=solid}
> public abstract class MyInterface implements Interface {
>     private static class MyInterfaceImpl extends MyInterface {}
>     public static MyInterface provide() {
>         return new MyInterfaceImpl();
>     }
> }
> {code}
> And below Groovy code:
> {code:title=Test.groovy|borderStyle=solid}
> class Test {
>     static void main(String[] args) {
>         MyInterface myInterface = MyInterface.provide()
>     }
> }
> {code}
> It yields following result:
> {noformat}
> Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Interface$ExternalInterface@24a35978' with class 'Interface$ExternalInterface' to class 'MyInterface'
> at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405)
> at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319)
> at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:232)
> at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603)
> at Test.main(Test.groovy:9)
> {noformat}
> Stacktrace during creating object of invalid type is:
> {noformat}
> at Interface.provide(Interface.java:7)
> at Interface$provide.call(Unknown Source)
> at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
> at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
> at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
> at Test.main(Test.groovy:9)
> {noformat}
> To me this seems to be a bug. Or is this expected behavior?



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
Loading...