La propiedad en la interfaz no puede tener un campo de respaldo

Estoy aprendiendo Kotlin . Mi código es el siguiente:

interface BaseLogicDecoupler<A : BaseViewNotifier, B : BaseScreenRouter> { var notifier: A? var router: B? fun attachNotifier(notifier: A?) { this.notifier = notifier } fun detachNotifier() { notifier = null; } fun attachRouter(router: B?) { this.router = router } fun detachRouter() { router = null; } } 

Pero cuando lo cambio y trato de proporcionar un acceso de propiedad como el siguiente:

 var notifier: A? get() = notifier 

No se comstack con el error que dice: Propiedad en la interfaz no puede tener un campo de respaldo .

Desde el documento aquí , las interfaces de Kotlin pueden proporcionar implementación y pueden tener properties con accesodores. ¿Por qué falla la compilation?

No puedo entender el error ¿Qué dice? ¿Alguien puede explicar en términos simples?

Este es un caso de esquina inesperado, felicitaciones para encontrarlo.

Permítanme explicar brevemente lo que sucede. Usaré una interfaz eliminada A y class B por simplicidad:

 interface A { var notifier: Int } 

Normalmente, una propiedad var en una class incluye 3 componentes: un backing field privado para almacenar su valor, un método setter para escribir en él y un método getter para leerlo. Pero una interfaz no puede tener un campo (porque vivir es doloroso y algunas matemáticas no sumn si lo hace), por lo que una propiedad var en una interfaz incluye solo 2 componentes: un setter y un getter .

Como mencioné anteriormente, nuestra interfaz A ha declarado 2 methods: un setter y un getter , ambos sin implementaciones. Vamos a agregarle algunas implementaciones:

 interface A2 { var notifier: Int get() {return 1} set(v) {} } 

Hasta aquí todo bien. Dos methods open con implementaciones, ninguno de ellos usa ningún campo. Pero, ¿qué ocurre si solo se declara una de las implementaciones?

 interface A3 { var notifier: Int //ERROR: Property in an interface cannot have a backing field get() {return 1} //set(v) {} } 

Resulta que si especifica solo un getter , Kotlin también genera un setter (pnetworkingeterminado) para la propiedad. En otras palabras, A3 es similar a A4 aquí:

 interface A4 { var notifier: Int get() {return 1} set(v) {field = v} //Obviously an error } 

Esto puede ser un error o un comportamiento intencionado. Aquí está el boleto del problema: https://youtrack.jetbrains.com/issue/KT-15193

Posibles soluciones:

  • declarar un colocador adecuado como en A2
  • usa una abstract class lugar de una interfaz