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

118
Vistas
Acceso al alcance externo con esto calificado en funciones de extensión para clases internas

¿Cómo puedo acceder al alcance externo desde una clase interna cuando creo una función de extensión para ella?

Ejemplo

 class A { inner class B { fun own() = this@A } }

Este código se compila y ejecuta como se supone que debe hacerlo.

Cuando agrego la siguiente función de extensión

 fun ABext() = this@A

La compilación falla con

 Error:(7, 22) Kotlin: Unresolved reference: @A

Leí la documentación para calificar esto y menciona brevemente las funciones de extensión, pero sin ningún ejemplo.

¿Es posible acceder al alcance externo desde las funciones de extensión?

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

0

Una función de extensión solo puede hacer cosas que no puede hacer una fun ext(x: AB) sin extensión, por lo que esperaría que no, al igual que no puede acceder a ella en Java . Esto se debe a que se compila en una función de este tipo, la sintaxis solo hace que parezca un miembro.

Si bien la clase B tiene un campo que contiene una referencia a la instancia externa A , no se puede acceder a este campo directamente desde el código por nombre. Permitir el acceso violaría la encapsulación .

La página vinculada habla de "acceder [ing] this desde un ámbito externo". "Alcance" aquí se usa en el sentido de https://en.wikipedia.org/wiki/Scope_(computer_science) , por lo que en el ejemplo tiene ámbitos donde los comentarios dicen "etiqueta implícita"

 class A { // outer scope 1 inner class B { // outer scope 2 fun Int.foo() { // function scope } } }

mientras

 fun ABext() = ...

no tiene ningún ámbito externo (excepto el ámbito del archivo, que no tiene this ). A menos que sea realmente

 class C { fun ABext() = // can use this@C }

pero no puede escribir this@A o this@B porque la función no está definida en el alcance de la class A o class B

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