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 2019/01/16 12:08:01 UTC

[jira] [Closed] (GROOVY-8881) Inner class - qualified "this" reference cast exception inside 2 closures

     [ https://issues.apache.org/jira/browse/GROOVY-8881?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Paul King closed GROOVY-8881.
-----------------------------

> Inner class - qualified "this" reference cast exception inside 2 closures
> -------------------------------------------------------------------------
>
>                 Key: GROOVY-8881
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8881
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler, groovy-runtime
>            Reporter: Anton Pryamostanov
>            Assignee: Paul King
>            Priority: Major
>             Fix For: 3.0.0-alpha-4, 2.5.5
>
>
> Let's consider the below example of qualified (Outer class) "this" reference from within the Inner class, used inside a closure defined inside another closure (2 layers of closures):
> {code:java}
> class OuterClass implements Runnable {
>     class InnerClass {
>         String bar() {
>             Closure closureOne = {
>                 Closure closureTwo = {
>                     OuterClass outerClassViaQualifiedThisReference = OuterClass.this
>                     return outerClassViaQualifiedThisReference
>                 }
>                 return closureTwo.call()
>             }
>             closureOne.call()
>         }
>     }
>     String toString() {
>         return "OuterClass"
>     }
>     void run() {
>         System.out.println(new InnerClass().bar())
>     }
> }
> {code}
> It produces the below runtime exception:
> {code}
> java.lang.ClassCastException: OuterClass$InnerClass cannot be cast to OuterClass$InnerClass$_bar_closure1
> 	at OuterClass$InnerClass$_bar_closure1$_closure2.doCall(ConsoleScript279:8)
> 	at OuterClass$InnerClass$_bar_closure1$_closure2.doCall(ConsoleScript279)
> 	at OuterClass$InnerClass$_bar_closure1.doCall(ConsoleScript279:11)
> 	at OuterClass$InnerClass$_bar_closure1.doCall(ConsoleScript279)
> 	at OuterClass$InnerClass.bar(ConsoleScript279:13)
> 	at OuterClass$InnerClass$bar.call(Unknown Source)
> 	at OuterClass.run(ConsoleScript279:23)
> {code}
> However the below code runs fine (if only 1 closure is used):
> {code:groovy}
> class OuterClass implements Runnable {
>     class InnerClass {
>         String bar() {
>             Closure closureOne = {
>                 //Closure closureTwo = {
>                     OuterClass outerClassViaQualifiedThisReference = OuterClass.this
>                     return outerClassViaQualifiedThisReference
>                 //}
>                 //return closureTwo.call()
>             }
>             closureOne.call()
>         }
>     }
>     String toString() {
>         return "OuterClass"
>     }
>     void run() {
>         System.out.println(new InnerClass().bar())
>     }
> }
> {code}
> *Expected result*:
> Code should run in both cases without runtime exceptions and should output "OuterClass".



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)