Skip to content
This repository was archived by the owner on Sep 28, 2022. It is now read-only.
This repository was archived by the owner on Sep 28, 2022. It is now read-only.

Not possible to implement a java.util.Comparator with AdapterFabric #571

@vvdleun

Description

@vvdleun

Hello,

This could be classified as simply "works as designed", but wanted to submit it nevertheless:

This code compiles in Golo 3.3.0....

module demo

function main = |args| {
	let conf = map[
		["interfaces", ["java.util.Comparator"]],
		["implements", map[
			["compare", |this, o1, o2| -> Integer.compare(o1: size(), o2: size())]
		]]
	]

	let foo = list[[1], [1, 2, 3], [1, 2]]
		
	Collections.sort(foo, AdapterFabric(): maker(conf): newInstance())
} 

...but when running, it throws the exception:

Exception in thread "main" org.eclipse.golo.runtime.adapters.AdapterDefinitionProblem: There is no implementation or override for: public abstract boolean java.util.Comparator.equals(j
ava.lang.Object)
        at org.eclipse.golo.runtime.adapters.AdapterDefinition.checkMethodsToBeImplemented(AdapterDefinition.java:181)
        at org.eclipse.golo.runtime.adapters.AdapterDefinition.validate(AdapterDefinition.java:91)
        at gololang.AdapterFabric.maker(AdapterFabric.java:158)
        at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
        at org.eclipse.golo.runtime.MethodInvocationSupport.fallback(MethodInvocationSupport.java:282)
        at demo.main(bug.golo:14)
        at org.eclipse.golo.cli.command.spi.CliCommand.callRun(CliCommand.java:39)
        at org.eclipse.golo.cli.command.GoloGoloCommand.execute(GoloGoloCommand.java:57)
        at org.eclipse.golo.cli.Main.main(Main.java:69)

When adding something like: ["equals", |this, o| -> false] to the conf implements map however, it throws:

Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at org.eclipse.golo.runtime.adapters.JavaBytecodeAdapterGenerator.generateIntoDefinitionClassloader(JavaBytecodeAdapterGenerator.java:82)
        at gololang.AdapterFabric.maker(AdapterFabric.java:159)
        at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
        at org.eclipse.golo.runtime.MethodInvocationSupport.fallback(MethodInvocationSupport.java:282)
        at demo.main(bug.golo:13)
        at org.eclipse.golo.cli.command.spi.CliCommand.callRun(CliCommand.java:39)
        at org.eclipse.golo.cli.command.GoloGoloCommand.execute(GoloGoloCommand.java:57)
        at org.eclipse.golo.cli.Main.main(Main.java:69)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.eclipse.golo.runtime.adapters.JavaBytecodeAdapterGenerator.generateIntoDefinitionClassloader(JavaBytecodeAdapterGenerator.java:80)
        ... 7 more
Caused by: java.lang.ClassFormatError: Duplicate method name "equals" with signature "(Ljava.lang.Object;)Z" in class file $Golo$Adapter$0
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877)
        ... 12 more

PS: Very nice to see development on Golo again!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions