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

Paul King updated GROOVY-7094:
------------------------------
    Fix Version/s: 2.5.13

> Semantic of access super fields is not consistent: super.@field == super.field
> ------------------------------------------------------------------------------
>
>                 Key: GROOVY-7094
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7094
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Pavel Alexeev
>            Assignee: Eric Milles
>            Priority: Major
>             Fix For: 4.0.0-alpha-1, 3.0.5, 2.5.13
>
>
> Hello.
> Operators page describe [Javafield(.@) 
> operator|http://groovy.codehaus.org/Operators#Operators-Javafield(.@)].
> Super.@ has been found in experiments and then in comments: 
> http://jira.codehaus.org/browse/GROOVY-5949?focusedCommentId=328216&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-328216
>  and does not reflected in documentation.
> [Groovy beans|http://groovy.codehaus.org/Groovy+Beans] make also differences 
> by accessing fields within or outside class:
> {quote}If you access a property from within the class the property is defined 
> in at compile time with implicit or explicit this (for example this.foo, or 
> simply foo), Groovy will access the field directly instead of going though 
> the getter and setter.{quote}
> Let's try that code:
> {code}
> class A{
>     def some = '_A.some field direct_';
>     def getSome(){
>         '-A.getSome()-'
>     }
>     
>     def test(){
>         println "this=$this"
>         println "super=$super"
>         println "this.some: ${this.some}"
>         println "this.@some: ${this.@some}"
>     }
> }
> class B extends A{
>     def getSome(){
>         '-B.getSome()-'
>     }
>     
>     def test(){
>         println "this=$this"
>         println "super=$super"
>         println "this.some: ${this.some}"
> //        println "this.@some: ${this.@some}" 
> //groovy.lang.MissingFieldException: No such field: some for class: B
>         println "super.some: ${super.some}"
>         println "super.@some: ${super.@some}"
>         println "super.getSome(): ${super.getSome()}"
>     }
> }
> A a = new A();
> B b = new B();
> println 'From A:'
> a.test()
> println "outside class: a.some: ${a.some}"
> println "outside class: a.@some: ${a.@some}"
> println 'From B:'
> b.test()
> println "outside class: b.some: ${b.some}"
> //println "outside class: b.@some: ${b.@some}" // 
> groovy.lang.MissingFieldException: No such field: some for class: B
> {code}
> Give next output:
> {noformat}
> From A:
> this=A@3179e3cb
> super=A@3179e3cb
> this.some: _A.some field direct_
> this.@some: _A.some field direct_
> outside class: a.some: -A.getSome()-
> outside class: a.@some: _A.some field direct_
> From B:
> this=B@538f7b25
> super=B@538f7b25
> this.some: -B.getSome()-
> super.some: -A.getSome()-
> super.@some: -A.getSome()-
> super.getSome(): -A.getSome()-
> outside class: b.some: -B.getSome()-
> {noformat}
> Some observations:
> * this and super refer to one object in base and child class.
> * Refer this.@some in child class (and outside class: b.@some) throw 
> "MissingFieldException: No such field" as seems correct because B has not 
> field some, but A.
> * "super.@some" does not throw exception in child class but goes through A 
> setter getSome() exactly as "super.some".
> My expectation what "super.@some" should refer parent class field directly.
> But at least documentations needs to be updated for more clear describe that 
> for case of inheritance and access rules with/within parent/childs classes.
> Also questionable but may be b.@some should work too? Off course java does 
> not inherit fields and properties, only methods, but in case of generated 
> public getters inherited it is really assumed in groovy, is not?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to