Kotlin: function abstracta con tipo de retorno genérico

Soy nuevo en Kotlin y realmente me preocupa si estoy escribiendo la syntax correcta o no. Tengo una súper class y quiero escribir una function abstracta genérica como la siguiente.

abstract class A { abstract fun <T> getText() : Test<T> } class B : A() { override fun <T> getText(): Test<T> { return Test1() // Error - Requinetworking Test<T>, found Test1 } } class C : A() { override fun <T> getText(): Test<T> { return Test2() // Error - Requinetworking Test<T>, found Test2 } } class Test1 : Test<String>() { } class Test2 : Test<Int>() { } 

¿Puedo resolver este tipo de problema con algún tipo de syntax adecuada? ¿Supongo que estoy cometiendo un error? ¿Alguien puede ayudarme?

Esta es la respuesta que estás buscando:

 abstract class A<T> { abstract fun getText() : Test<T> } class B : A<String>() { override fun getText(): Test<String> = Test1() } class C : A<Int>() { override fun getText(): Test<Int> = Test2() } class Test1 : Test<String>() class Test2 : Test<Int>() open class Test<T> 

Solo necesita mover el parámetro T de la firma del método a la class.

Bonificación: actualicé el fragment anterior a Kotlin más idiomático

Lo que estás haciendo no puede ser correcto, porque permitiría el siguiente código:

 val test: Test<Int> = B().getText() 

B().getText() intenta devolver Test1() , que es Test<String> . Pero debido a que el tipo de devolución puede ser cualquier cosa, es válido. Esto rompe el sistema de types.

Es probable que desee imponer el tipo de la class en lugar del método, debido al ejemplo de Kiskae.

Por ejemplo:

 abstract class A<T> { abstract fun getText() : Test<T> } 

puede ser extendido usando

 class B : A<String>() ... 

que coincidirá con el tipo para Test1

  • Obtén la function por nombre dinámicamente en Kotlin
  • Desarrollo de expresión lambda
  • Kotlin: ¿Puedes usar arguments con nombre para varargs?
  • El método TaskStackBuilder addParentStack () no funciona
  • kotlin setter infinte recursión
  • Kotlin: ¿Cuando la function de extensión oculta la implementación pnetworkingeterminada de la class?
  • ¿Cómo obtengo los encabezados de respuesta con RxAndroid + Retrofit en Kotlin?
  • ¿Cómo configurar un proyecto de eclipse para usar Kotlin con JPA / Hibernate?
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • no se puede convertir en org.jetbrains.kotlin.java.model.types.JeClassInitializerExecutableTypeMirror
  • Enrutamiento de contenido estático en VertX