Herencias internas Herencia en Kotlin

Estoy tratando de crear una jerarquía de pocas classs, cada una anulando algún comportamiento en las classs internas de su padre (específicamente iteradores, pero no importa). Básicamente, se ve así:

open class SuperClass<T>{ protected open inner class InnerClass{ fun someLogic(){ println("some logic happened") } open fun someOverridableLogic(){ println("some logic happened") } } } class ChildClass<T> : SuperClass<T>(){ protected inner class ChildInnerClass:InnerClass{ override fun someOverridableLogic(){ super.someOverridableLogic() println("some OTHER logic happened") } } } 

El comstackdor se niega a trabajar con este código, esperando el parámetro de tipo en InnerClass cuando ChildInnerClass henetworkinga de él. Sin embargo, después de agregar un parámetro como este:

 protected inner class ChildInnerClass:InnerClass<T> 

el comstackdor de repente no espera ningún tipo de parameters!

El equivalente de Java de esto se comstack y ejecuta como se esperaba, sin parameters de tipo:

 public class SuperClass<T> { protected class InnerClass{ public void someLogic(){ System.out.println("some logic happened"); } public void someOverridableLogic(){ System.out.println("some logic happened"); } } } public class ChildClass<T> extends SuperClass<T>{ protected class ChildInnerClass extends InnerClass{ @Override public void someOverridableLogic() { super.someOverridableLogic(); System.out.println("some OTHER logic happened"); } } } 

Entonces, ¿estoy haciendo algo mal en Kotlin, o es simplemente una restricción de idioma del que no tenía conocimiento?

El comstackdor no espera un argumento de tipo en InnerClass sino en SuperClass en SuperClass.InnerClass . Este es un problema conocido: Capturar generics en classs internas: KT-9208 .

Por ahora puedes hacer lo siguiente:

 open class SuperClass<T> { protected open inner class InnerClass { fun someLogic() { println("some logic happened") } open fun someOverridableLogic() { println("some logic happened") } } } class ChildClass<T> : SuperClass<T>() { protected inner class ChildInnerClass : SuperClass<T>.InnerClass() { override fun someOverridableLogic() { super.someOverridableLogic() println("some OTHER logic happened") } } } 

Consulte también los parameters del tipo de context de Hadoop en Kotlin para get un ejemplo y una respuesta similares.

  • La llamada de escritura / transacción se elimina en TransactionalEventListener
  • ¿Cómo escribir un inicializador estático a nivel de package en Kotlin?
  • De Java a Kotlin
  • ¿Hay alguna forma de reutilizar una instancia de Job?
  • Kotlin, operación genérica en Número
  • Smart Cast para BootsrapButton es imposible porque endtrip es una propiedad mutable que ha cambiado en este momento
  • Usando @JvmOverloads de Kotlin con el patrón Fragment.newInstance () de Android
  • ¿Cómo puedo hacer que cada punto final de descanso lea una cookie y use ese valor en okhttp Interceptor?
  • Quiero cambiar el background después de hacer clic en Botón en Android con Kotlin
  • msg: ¿No se puede encontrar el getter para el atributo 'android: text' con el tipo de valor java.lang.String en el data binding?
  • ¿Cómo pruebo generadores para properties delegadas?