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í

  • ¿Por qué ocultar un Fragmento causa una exception de puntero nulo?
  • Reemplazar 'writeToParcel' no está permitido. Use el object compañero 'Parceler' en su lugar
  • Kotlin || ¿No puedo agregar la biblioteca a Mi aplicación?
  • Gradle tomando time al frente aparentemente sin hacer nada
  • Construcción de proyecto de gradle de varios modules en Travis CI
  • ¿Hay alguna manera de orderar las keys groupBy en rx-java / kotlin?
  • ¿Por qué Kotlin soltó la palabra key "nueva"?
  • Argumentos pnetworkingeterminados de Kotlin en error de interfaz?
  • Kotlin - Defina la variable globalmente para WebView
  • Error de compilation de Kotlin: no se puede invocar ninguna de las siguientes funciones con los arguments suministrados
  • Tema de cierre de PlaceAutoCompleteFragment