es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué Kotlin no está quejándose de la ambigüedad? ¿Y por qué está llamando al constructor secundario?

Estaba probando algo en Kotlin y ahora no podré dormir adecuadamente si no encuentro una respuesta.

Mira esta clase:

data class Person(
    val name: String,
    val age: Int? = 0
) {
    constructor(
        secondName: String,
        secondAge: Int = 5
    ) : this(
        name = "$secondName 2",
        age = secondAge
    )
}

fun main() {
    val firstCase  = Person("Lorem")     // Se queja de ambigüedad.
    val secondCase = Person("Lorem", 42) // Llama al constructor secundario.
}

Es comprensible quejarse de la ambigüedad en el primer caso, pero ¿por qué no sucede lo mismo en el segundo caso? ¿Y por qué decidió llamar al constructor secundario y no al constructor principal?

Ahora, si agrego otro parámetro en el constructor principal con un valor predeterminado:

data class Person(
    val name: String,
    val age: Int? = 0,
    val isAdult: Boolean = false
) {
    constructor(
        secondName: String,
        secondAge: Int = 5
    ) : this(
        name = "$secondName 2",
        age = secondAge
    )
}

fun main() {
    val thirdCase = Person("Lorem") // Llama al constructor secundario.
}

Esperaba tener ambigüedad en el tercer caso, igual que en el primer caso. ¡Pero no! Llama al constructor secundario. ¿Por qué?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que secondCase llama al constructor secundario es porque pasa explícitamente el segundo parámetro, coincidiendo así con la firma del constructor secundario. En cuanto a thirdCase, aunque existen dos constructores que podrían coincidir, se prioriza el constructor primario porque tiene un parámetro menos que el constructor secundario. El compilador elegirá el constructor con menos parámetros si no hay una coincidencia clara. Dado que thirdCase solo pasa un parámetro, coincide con la firma del constructor primario y, por lo tanto, lo llama en lugar del constructor secundario.

Comments are closed.