Spec-Zone.ru › Kotlin 2

Выражения this

Выражение this ссылается на текущий получатель (объект, с которым работает функция). Использование this зависит от контекста:

  • В члене класса this ссылается на текущий объект этого класса.

    Например, в следующем коде this.name означает свойство name текущего объекта Language:

    class Language(val name: String) {
        fun printName() {
            println(this.name)
        }
    }
    
    fun main() {
        val language = Language("Kotlin")
        language.printName()
        // Kotlin
    }
    
  • В функции-расширении или литерале функции с получателем this ссылается на получателя.

    В следующем примере lastCharacter() вызывается для строки "Kotlin". Поэтому "Kotlin" является получателем. Внутри функции-расширения this ссылается на "Kotlin". Это означает, что this.length — длина "Kotlin":

    fun String.lastCharacter(): Char {
        println(this.length)
        // 6
        return this[this.length - 1]
    }
    
    fun main() {
        println("Kotlin".lastCharacter())
        // n
    }
    

В простых случаях не нужно явно указывать this. Kotlin определяет его по текущей области видимости. Подробнее см. в разделе Неявный this.

Квалифицированный this

Когда области видимости получателей вложены, в вашем коде одновременно может быть доступно несколько получателей. Kotlin может использовать любой доступный получатель для неявного доступа к его членам, но получатели из внутренних областей видимости имеют более высокий приоритет. Чтобы явно обратиться к определённому получателю, используйте квалифицированный this. Это особенно полезно, когда у нескольких получателей есть члены с одинаковыми именами и нужно обратиться к члену внешнего получателя.

Чтобы использовать квалифицированный this, добавьте квалификатор метки:

this@label

Метка указывает компилятору, к какому получателю обращаться. Можно использовать имя внешнего класса или функции-расширения. Например, this@foo ссылается на получателя внешней функции-расширения с именем foo.

Доступ к внешнему классу из внутреннего класса

В внутреннем классе неквалифицированное this ссылается на экземпляр внутреннего класса. Чтобы обратиться к объекту внешнего класса, используйте квалифицированное this:

class User(val name: String) {
    inner class Age(val value: Int) {
        fun printInfo() {
            
            // Refers to the value property of the current Age object
            println(this.value)
            // 22
            
            // Refers to the name property of the outer User object 
            println(this@User.name)
            // Jane Doe
        }
    }
}

fun main() {
    val user = User("Jane Doe")
    val age = user.Age(22)
    age.printInfo()
}

Только внутренние классы хранят ссылку на экземпляр внешнего класса. Обычные вложенные классы не имеют доступа к this внешнего класса.

Доступ к классу из функции-расширения

Если объявить функцию-расширение внутри класса, будут доступны два получателя:

  • Получатель расширения: значение, для которого вызывается функция-расширение.

  • Получатель-диспетчер: текущий объект класса, в котором объявлена функция-расширение.

Используйте квалифицированный this, чтобы указать нужного получателя:

class User(val name: String) {
    val prefix = "Name"

    fun String.formatName(): String {
        return "${this@User.prefix}: ${this.uppercase()}"
    }

    fun printName() {
        println(name.formatName())
    }
}

fun main() {
    val user = User("Jane Doe")
    user.printName()
    // Name: JANE DOE
}

Здесь:

  • this ссылается на получателя расширения (String), поэтому this.uppercase() преобразует строку в верхний регистр.

  • this@User ссылается на текущий объект User.

  • this@User.prefix обращается к свойству prefix текущего объекта User.

Доступ из лямбда-выражения

В отличие от обычной лямбды, лямбда с получателем вводит получателя в свою область видимости. В результате this внутри лямбды ссылается на получателя лямбды, а не на получателя из внешней области видимости. Если лямбда с получателем вложена в другую область видимости получателя, добавьте к лямбде метку и используйте квалифицированный this, чтобы явно обратиться к получателю лямбды или к получателю из внешней области видимости:

class User(val name: String) {
    fun printWithPrefix() {
        val printString: String.() -> Unit = stringLabel@ {
            println("${this@stringLabel}: ${this@User.name}")
        }

        printString("User")
    }
}

fun main() {
    val user = User("Jane Doe")
    user.printWithPrefix()
    // User: Jane Doe
}

Здесь:

  • stringLabel@ задаёт метку лямбды.

  • this@stringLabel ссылается на строку-получатель лямбды.

  • this@User ссылается на текущий объект User.

Метка ничего не вызывает и не меняет работу лямбды. Она лишь помогает обратиться к получателю лямбды.

Доступ к анонимному объекту или его внешнему классу

Анонимный объект имеет собственную область видимости получателя. В теле объекта неквалифицированное this ссылается на сам анонимный объект. Однако анонимные объекты не имеют имён классов, поэтому их нельзя использовать в качестве квалификаторов this. Таким образом, обратиться к анонимному объекту можно только с помощью неквалифицированного this:

interface UserPrinter {
    fun print()
}

fun main() {
    val printer = object : UserPrinter {
        val prefix = "User"
        
        override fun print() {
            // `this` refers to the anonymous object
            // `this.prefix` accesses its `prefix` property
            println(this.prefix)
        }
    }
    printer.print()
    // User
}

Если объявить анонимный объект внутри другого класса, для доступа к внешнему объекту можно использовать квалифицированное this:


interface UserPrinter {
    fun print()
}

class User(val name: String) {
    fun createPrinter(): UserPrinter {
        return object : UserPrinter {
            override fun print() {
                // `this@User` refers to the enclosing `User` object
                // `this@User.name` accesses its `name` property
                println(this@User.name)
            }
        }
    }
}

fun main() {
    val printer = User("Jane Doe").createPrinter()
    printer.print()
    // Jane Doe
}

Неявный this

При вызове функции-члена для this можно опустить квалификатор this.. Однако, если в более близкой лексической области видимости доступен другой вызываемый элемент с таким же именем, Kotlin связывает неквалифицированный вызов с этим элементом, а не с функцией-членом. Чтобы явно вызвать функцию-член, используйте квалификатор this.:

fun main() {
    class A {
        fun printLine() {
            println("Member function")
        }

        fun invokePrintLine() {
            fun printLine() {
                println("Local function")
            }
         
            printLine()
            // Local function
         
            this.printLine()
            // Member function
        }
    }

    A().invokePrintLine()
}
12 августа 2026 г.
Объявления и выражения объектовЗапечатанные классы и интерфейсы

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/this-expressions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API