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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions