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

Slawomir Nowak commented on GROOVY-8338:
----------------------------------------

[~paulk]
Ok, so this is what I've found so far:
If you define an interface:
{code}
public interface InterfaceWithStaticMethod {

    static boolean someStaticMethod() {
        return true;
    }
}{code}

then this works:
{code}class StaticMethodCall extends Specification {
    def 'static method call test'() {
        expect:
        InterfaceWithStaticMethod.someStaticMethod()
    }
}{code}

however this fails:
{code}class StaticMethodCall extends Specification {
    def 'static method call test'() {
        expect:
        def result = InterfaceWithStaticMethod.someStaticMethod()
        result
    }
}{code}
with {code}java.lang.VerifyError: (class: 
example/app/InterfaceWithStaticMethod$someStaticMethod, method: callStatic 
signature: (Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object;) Illegal 
type in constant pool

        at 
java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3110)
        at java.base/java.lang.Class.getConstructor0(Class.java:3315)
        at java.base/java.lang.Class.getConstructor(Class.java:2108)
        at com.example.app.StaticMethodCall.static method call 
test(StaticMethodCall.groovy:9){code}

Do you want me to put @CompileStatic on top of the test class?



> Calling Stream.of from groovy class in JDK 9 fails
> --------------------------------------------------
>
>                 Key: GROOVY-8338
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8338
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.4.12
>            Reporter: Marcus Nylander
>
> Trying to call Stream.of from groovy class (groovy version 2.4.12) using JDK 
> 9 (jdk 9 181) fails. 
> Example:
> {code}
> package test
> import java.util.stream.Stream
> class B {
>     static void main(String[] args) {
>         Stream.of("1").forEach({ println(it) })
>     }
> }
> {code}
> The code above fails with:
> Exception in thread "main" java.lang.IncompatibleClassChangeError: Method 
> java.util.stream.Stream.of(Ljava/lang/Object;)Ljava/util/stream/Stream; must 
> be InterfaceMethodref constant
>       at java_util_stream_Stream$of.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:125)
>       at test.B.main(B.groovy:7)
> The same occurs for other interface static methods also:
> {code}
> public interface D {
>     static D of(String s) {
>         return new D() {
>         };
>     }
> }
> class C {
>     static void main(String[] args) {
>         D.of("1")
>     }
> }
> {code}
> Also fails with:
> Exception in thread "main" java.lang.IncompatibleClassChangeError: Method 
> test.D.of(Ljava/lang/String;)Ltest/D; must be InterfaceMethodref constant
>       at test.D$of.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:125)
>       at test.C.main(C.groovy:7)
> Running with JDK 8 works fine.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to