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

Paul King reassigned GROOVY-8881:
---------------------------------

    Assignee: Paul King

> 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
>
> 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)

Reply via email to