You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (Jira)" <ji...@apache.org> on 2022/02/03 22:36:00 UTC
[jira] [Closed] (GROOVY-8433) Anonymous inner class results in cast exception with @Category applied
[ https://issues.apache.org/jira/browse/GROOVY-8433?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Paul King closed GROOVY-8433.
-----------------------------
> Anonymous inner class results in cast exception with @Category applied
> ----------------------------------------------------------------------
>
> Key: GROOVY-8433
> URL: https://issues.apache.org/jira/browse/GROOVY-8433
> Project: Groovy
> Issue Type: Bug
> Reporter: Eric Milles
> Assignee: Eric Milles
> Priority: Major
> Fix For: 4.0.0
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> In working with a library that required extension of an SAM type to add a function binding, I thought of using {{@Category}} to soften the integration. What I found is that the implicit {{this}} parameter that is passed to the constructor of an anon. inner class is being transformed from the containing class to the category class due to the application of the {{@Category}} transform.
> Below I have boiled it down to the fewest moving parts I can. {{LibraryContext}} is the type that needs functions bound to it and the interface for doing so is {{LibraryFunction}} which requires constructor params so I cannot use SAM Closure coercion. My first take was to create {{Factory.Binder}} to get the details out of the way. That resulted in the cast exception below. When I converted {{Binder}} to define static methods with a first param of {{LibraryContext}} all is well.
> So I thought I would raise the issue that anon. inners and {{@Category}} are not currently compatible.
> {code}
> Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'scripts.LibraryContext@6a28ffa4' with class 'scripts.LibraryContext' to class 'scripts.Factory$Binder'
> org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'scripts.LibraryContext@6a28ffa4' with class 'scripts.LibraryContext' to class 'scripts.Factory$Binder'
> at scripts.Factory$Binder.bindStringFunction(CategoryTransform.groovy:18)
> at scripts.Factory$_create_closure1.doCall(CategoryTransform.groovy:10)
> at scripts.Factory$_create_closure1.doCall(CategoryTransform.groovy)
> at scripts.Factory.create(CategoryTransform.groovy:9)
> at scripts.Factory$create.call(Unknown Source)
> at scripts.CategoryTransform.run(CategoryTransform.groovy:42)
> {code}
> {code:java}
> package scripts
> class Factory {
> private Factory() {}
> static LibraryContext create() {
> LibraryContext context = new LibraryContext()
> use (Binder) {
> context.bindStringFunction('', { String[] strings -> '' })
> }
> return context
> }
> @Category(LibraryContext)
> private static class Binder {
> void bindStringFunction(String name, java.util.function.Function<String[], String> func) {
> def stringFunction = new LibarayFunction(name, 0) { // cast exception here due to implicit first param of "this"
> @Override
> String compute(String... args) {
> func.apply(args)
> }
> }
> this.bind(name, stringFunction)
> }
> }
> }
> class LibraryContext {
> void bind(String name, Object value) {
> }
> }
> abstract class LibarayFunction {
> LibarayFunction(String name, int argc) {
> }
> abstract String compute(String... argv);
> }
> Factory.create()
> {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)