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

563
Vistas
Kotlin: cómo llamar a la súper implementación de un método de extensión

En Kotlin tengo un código como el siguiente:

 open class A { protected open fun B.doSomething() {} } class B {} class C : A() { override fun B.doSomething() { print("first, do some C-specific logic") print("now try to call super implementation. How?") super.doSomething() // does not compile super<A>.doSomething() // does not compile super<B>.doSomething() // does not compile } }

Y me gustaría saber, ¿cómo puedo llamar a la implementación de superclase de doSomething() en este caso? ¿O no es posible llamar a una súper implementación para una función de extensión en kotlin?

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

0

Este problema se ha informado en KT-11488 . Actualmente no es posible. La especificación de Kotlin dice que los miembros candidatos para una llamada super se encuentran de la siguiente manera:

Para una f invocable con un receptor de superforma básico explícito super en una declaración de clasificador con supertipos A1, A2, …, AN, se consideran los siguientes conjuntos para no vacíos:

  • Llamables de miembros que no son de extensión denominados f de tipo A1 ;
  • Llamables de miembros que no son de extensión denominados f de tipo A2 ;
  • …;
  • Llamables de miembros que no son de extensión denominados f de tipo AN .

Si al menos dos de estos conjuntos no están vacíos, se trata de un error de tiempo de compilación. De lo contrario, el conjunto no vacío (si lo hay) se analiza como de costumbre.

Para una f invocable con un super<A> receptor de superforma extendido explícito, se analizan los siguientes conjuntos (en el orden dado):

  • Llamables de miembros que no son de extensión denominados f de tipo A .

Como puede ver, solo se consideran los "miembros que no son de extensión". Las funciones de extensión no se consideran en absoluto.

Por ahora, puede hacer una solución como esta (también se sugiere algo similar en el ticket):

 open class A { protected open fun B.doSomething() = bDoSomething(this) // make a non-extension function to put A's implementation in there protected fun bDoSomething(receiver: B) { print("A implementation") } } class C : A() { override fun B.doSomething() { print("first, do some C-specific logic") super.bDoSomething(this) // call the non-extension function } }
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