Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Variables shadowing in Kotlin for inner classes: how variables are resolved?

I have the following code snippet in Kotlin. I love such code puzzlers, but the result here was too unexpected for me. Can someone describe me why it prints 1 and not 2?

As shadowing is prohibited in Java - it looks like I completely do not understand how it works in Kotlin.

fun main() {
    var a = 1
    class A {
        var a = 2

        fun foo() = a
    }

    println(A().foo())
}

=========== BONUS ============

Funny thing is that the following code when you will move var a = 1 after the class declaration works fine and prints 2:

fun main() {
    
    class A {
        var a = 2

        fun foo() = a
    }

    var a = 1
    println(A().foo())
}

UPD: it looks like Kotlin suddenly decided to play like C++ and have undefined behavior :D

From the Kotlin spec: use this with caution, because in some cases it can be called instead.

like image 749
Andrew Kuleshov Avatar asked Oct 14 '22 22:10

Andrew Kuleshov


1 Answers

When you do var a = 2 inside the class A, you're not actually shadowing any variable. You're declaring that a is a field of class A, and it defaults to 2.

When you reference a variable in front of a class, Kotlin will add an implicit this (e.g. a becomes this.a) if there is a field with that name but not an upper-level variable with that name. So, the outer a takes precedence over the field, and you'd have to use this.a to access the inner a.

like image 110
Aplet123 Avatar answered Oct 21 '22 18:10

Aplet123