Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

565
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!