Sobes.tech
Junior

Como funcionam as palavras-chave 'super' e 'this' em Kotlin?

sobes.tech IA

Resposta da IA

this refere-se à instância atual da classe ou ao destinatário de uma expressão lambda. É usado para indicar explicitamente um membro da classe ou uma referência ao objeto atual quando há ambiguidade (por exemplo, quando há uma variável local com o mesmo nome).

super é usado para chamar métodos ou acessar propriedades da classe pai. Aplica-se quando é necessário usar a implementação da classe pai em vez da implementação sobrescrita na classe atual.

Exemplos:

class MyClass(val value: Int) {
    fun printValue() {
        println(this.value) // Uso explícito de this para acessar a propriedade
    }
}

open class Parent {
    open fun greet() {
        println("Olá do pai")
    }
}

class Child : Parent() {
    override fun greet() {
        super.greet() // Chamada ao método da classe pai
        println("Olá do filho")
    }
}

Ao usar em funções lambda, this pode referir-se ao receptor da lambda:

fun String.addExclamation(): String {
    return this + "!" // this refere-se à string receptora
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val sum = numbers.sum() // sum é uma função de extensão, this dentro refere-se à lista numbers
    println(sum)
}

Para resolver ambiguidades, quando há classes aninhadas ou lambdas com receptores, pode-se usar this@ClassName ou this@label:

class A { // etiqueta implícita @A
    inner class B { // etiqueta implícita @B
        fun Int.foo() { // etiqueta implícita @foo
            val a = this@A // referência à instância de A
            val b = this@B // referência à instância de B
            val c = this // referência à instância de Int, receptor da função foo
            val c1 = this@foo // referência à instância de Int, receptor da função foo
        }
    }
}