[
https://issues.apache.org/jira/browse/GROOVY-10060?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17789833#comment-17789833
]
ASF GitHub Bot commented on GROOVY-10060:
-----------------------------------------
eric-milles commented on PR #1997:
URL: https://github.com/apache/groovy/pull/1997#issuecomment-1826873641
Something is missing in the stub generator, because when I try to add a
static method to a groovy interface, it states that the java implementer needs
to implement the abstract method.
Here is my `org.codehaus.groovy.classgen.InterfaceTest` that is updated to
try out the Java interop if these new changes:
```groovy
package org.codehaus.groovy.classgen
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
import org.junit.Test
final class InterfaceTest {
@Test
void testJavaImplementsGroovyInterface() {
def config = new CompilerConfiguration(
targetDirectory: File.createTempDir(),
jointCompilationOptions: [memStub: true]
)
def parentDir = File.createTempDir()
try {
new File(parentDir, 'test').mkdir()
def a = new File(parentDir, 'test/GClass.groovy')
a.write '''package test
class GClass {
}
'''
def b = new File(parentDir, 'test/GInterface.groovy')
b.write '''package test
interface GInterface {
GClass[] getGC()
default String foo() { 'foo' + GInterface.this.bar() }
private String bar() { 'bar' }
// static String baz() { 'baz' }
}
'''
def c = new File(parentDir, 'test/JClass.java')
c.write '''package test;
public class JClass implements GInterface {
public GClass[] getGC() {
return new GClass[0];
}
public String toString() {
return this.foo();
}
}
'''
def d = new File(parentDir, 'Main.groovy')
d.write '''
def jc = new test.JClass()
assert jc.getGC().length == 0
assert jc.toString() == 'foobar'
// assert test.JClass.baz() == 'baz'
'''
def loader = new GroovyClassLoader(this.class.classLoader)
def cu = new JavaAwareCompilationUnit(config, loader)
cu.addSources(a, b, c, d)
cu.compile()
loader.loadClass('Main').main()
} finally {
config.targetDirectory.deleteDir()
parentDir.deleteDir()
}
}
}
```
> Support static & private interface methods
> ------------------------------------------
>
> Key: GROOVY-10060
> URL: https://issues.apache.org/jira/browse/GROOVY-10060
> Project: Groovy
> Issue Type: Sub-task
> Components: Compiler
> Reporter: Christopher Smith
> Assignee: Paul King
> Priority: Major
>
> Apologies if this is a dupe, but I went back as far as 6000, and GROOVY-8299
> is the only relevant ticket I saw.
> Since Java 8, interfaces can carry static methods like classes. Groovy still
> (as of 3.0.8) does not support adding static methods to interfaces.
> {code}
> The method 'java.lang.String dynamoTableNameForType(java.lang.String)' from
> interface 'com.example.HasDynamo' must not be static. Only fields may be
> static in an interface.
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)