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í

  • Incluyendo la biblioteca de reflexión en un file jar generado por kotlinc
  • Clases anónimas con lambdas en Kotlin
  • Las properties de delegado de Kotlin implementan la function de operador 'provideDelegate', pero el método nunca se llama
  • Kotlin: ¿Cómo puedo crear una function henetworkingable "estática"?
  • Error al convertir bytecode - DexException - Firebase Auth
  • Cuál es la diferencia entre la class normal y la class de datos en kotlin
  • Comstackción manual de JAR para Scala & Kotlin
  • ¿Puedo hacer que el constructor pnetworkingeterminado de una class generada a partir de un file Kotlin sea privado?
  • Las células RecyclerView se deforman cuando se abre el keyboard
  • ¿Propiedades volátiles en Kotlin?
  • Error de compilation llamando a un método de extensión desde otro método de extensión en Kotlin