Sintaxis de quilates en las interfaces de Kotlin

Puede ayudar a explicar esto solo un poco.

Digamos que tengo una class abstracta llamada Página que se ve así:

abstract class Page { abstract fun title() : String } 

Y una interfaz llamada Libro:

 interface Book { fun write(page: Page) fun read(title: String) Page } 

Mi pregunta es cómo puedo usar la syntax genérica de carat para especificar que los methods deben ser utilizados por instancia derivada de la class de página. Tal vez así:

 interface Book<Page> { fun write(page: Page) fun read(title: String) : Page } class AdventureBookPage(val pageTitle: String, val content: String) : Page() { override fun title() : String { return title } } class AdventureBook : Book<AdventureBookPage> { override fun write(abp: AdventureBookPage) { // do writing ops } override fun read(title: String) : AdventureBookPage { // do read ops } } 

¿Estoy entendiendo mal cómo funcionan los generics aquí? Cualquier ayuda sería muy apreciada.

¿Estoy entendiendo mal cómo funcionan los generics aquí?

Sí un poco.

 interface Book<Page> { fun write(page: Page) fun read(title: String) : Page } 

Lo que esencialmente has declarado aquí es esto:

 interface Book<Foo> { fun write(page: Foo) fun read(title: String) : Foo } 

Page era solo un identificador, que representa cualquier tipo antiguo. Puede hacer un Book<String> , un Book<HttpClient> o un Book<ArrayList<String>> . Normalmente, en lugar de Foo o Page , se usa el identificador T , que significa "tipo".

El hecho de que el identificador coincida con un tipo que ha creado usted mismo es solo accesorio.

Lo que supongo que estabas tratando de declarar es que un libro es una colección de páginas, o algo más especializado que una página. Esto se llama una 'restricción genérica' , y lo expressías así:

 interface Book<T : Page> { fun write(page: T) fun read(title: String) : T } 

Puede usar las restricciones de kotlin, específicamente los límites superiores:

 interface Book<T : Page> { fun write(page: T) fun read(title: String) : T } 

documentos aquí

  • delegar la invocación de cierre nested a la class correspondiente
  • Fuera de memory usando Volley en Kotlin
  • ¿Cómo manejar adecuadamente una perspectiva variable nula en kotlin?
  • cómo a la matriz de initialization en Kotlin?
  • Usar kotlin con ContentResolver causa IllegalArgumentException
  • Cómo evitar que kotlin.Unit object sea eliminado por Proguard
  • Kotlin null de Java
  • RecyclerView animation de elementos, se llama AnimationFinished, pero no está activado en AnimationStarted. ¿Por qué?
  • La class genérica de extensión Y implementa la interfaz en Kotlin
  • Kotlin después de 60 segundos detener la toma de logging de voz
  • Error ': android: transformKotlinClassesWithJillForDebug'. Al comstackr una aplicación para Android escrita en Kotlin + LibGDX