Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

143
Vistas
El setter generado choca con un método de interfaz

Estoy escribiendo una clase que implementa una interfaz que expone un método setSelected . Esta clase tendrá una propiedad selected :

 private class Foo : IFoo { var selected = false override fun setSelected(isActive: Boolean) { selected = isActive } }

Sin embargo, el compilador se queja, ya que Kotlin genera un setter para selected , de que los dos métodos chocan:

 Error:(14, 9) Kotlin: [com.bar.jvmTest] Platform declaration clash: The following declarations have the same JVM signature (setSelected(Z)V): fun <set-selected>(<set-?>: Boolean): Unit defined in foo.bar.baz.Foo fun setSelected(isActive: Boolean): Unit defined in foo.bar.baz.Foo Error:(24, 9) Kotlin: [com.bar.jvmTest] Platform declaration clash: The following declarations have the same JVM signature (setSelected(Z)V): fun <set-selected>(<set-?>: Boolean): Unit defined in foo.bar.baz.Foo fun setSelected(isActive: Boolean): Unit defined in foo.bar.baz.Foo

  • Me encantaría eliminar el método personalizado para aprovechar el setter, pero luego no está marcado como override y, por lo tanto, mi clase no implementa completamente la interfaz:

     Error:(11, 13) Kotlin: [com.bar.jvmTest] Class 'Foo' is not abstract and does not implement abstract member public abstract fun setSelected(isActive: Boolean): Unit defined in bar.baz

  • Sé que puedo cambiar el nombre selected a, por ejemplo, dataSelected para que el setter generado no entre en conflicto con el método, pero debería haber una manera de mantener este nombre de propiedad simple e implementar la interfaz como se esperaba.
  • ¿Hay alguna manera de pedirle al compilador de Kotlin que no genere un setter para esta propiedad o que la marque como override ?

    over 4 years ago · Santiago Trujillo
    2 Respuestas
    Responde la pregunta

    0

    Puede crear una propiedad sin un campo de respaldo y luego anular su función abstracta de esta manera:

     class Foo : IFoo { private var hiddenSelected = false val selected get() = hiddenSelected override fun setSelected(isActive: Boolean) { hiddenSelected = isActive } }

    Actualizar:

    Después de dormir, creo que esta solución no es tan buena por 2 razones:

    1. Introduce un nuevo campo ( hiddenSelected ) que no es necesario
    2. No puede realizar asignaciones a ese campo utilizando las formas estándar de Kotlin ( = operador)

    Creo que la mejor solución sería esta:

     class Foo : IFoo { @set:JvmName("setSelected0") var selected: Boolean = false set(value) { setSelected(value) } override fun setSelected(isActive: Boolean) { // Possibly some other stuff println("Now i'm using my own setter!") selected = isActive } }

    Usando la anotación @JvmName , puede decirle al compilador cómo nombrar esa función específica. Kotlin crea automáticamente un getter y setter para cada propiedad, por lo que debe usar el modificador set: para anotar el setter de esa propiedad y no la propiedad en sí.

    También es muy importante que implemente un setter personalizado para esa propiedad para que pueda escribir esto de manera segura :

     Foo().selected = true // This also prints "Now i'm using my own setter!"

    en lugar de esto:

     Foo().setSelected(true)

    Es posible que su colocador pueda hacer otras cosas (como imprimir ese registro), lo que puede tener efectos secundarios, por lo que debe asegurarse de llamar al colocador correcto. A veces, esto puede ser un poco complicado, ya que Kotlin siempre crea un setter para cada variable mutable ( var ).

    over 4 years ago · Santiago Trujillo Denunciar

    0

    Puede usar @JvmName para cambiar el nombre del setter generado :

     private class Foo : IFoo { @set:JvmName("setSelected0") var selected = false override fun setSelected(isActive: Boolean) { selected = isActive } }

    El uso de Kotlin sigue siendo el mismo.

    over 4 years ago · Santiago Trujillo Denunciar
    Responde la pregunta
    Encuentra empleos remotos

    ¡Descubre la nueva forma de encontrar empleo!

    Top de empleos
    Top categorías de empleo
    Empresas
    Publicar vacante Precios Comercial
    Legal
    Términos y condiciones Política de privacidad
    © 2026 PeakU Inc. All Rights Reserved.
    Andres GPT
    Recomiéndame algunas ofertas
    Necesito ayuda