Kotlin y los constructores generics me dejan desconcertado

No entendiendo Kotlin en combinación con Generics.

Estaba intentando mover algo de mi java hacia kotlin. Un par de esas classs son repositorys de datos de spring y un service genérico que toma como parámetro genérico un tipo de repository, por ejemplo:

@Transactional interface ForumRepository : CrudRepository<Forum, Long> { fun findByName(name: String): Forum? } 

Luego, el GenericKotlinService:

 abstract class GenericKotlinService<T>(val repository: CrudRepository<Any, Serializable>) { fun <T> findOne(id: Serializable): T { return repository.findOne(id) as T } fun delete(id: Any) { repository.delete(id) } } 

Sin embargo, ahora cuando trato de crear un service que use este service genérico con un CrudRepository específico, siempre obtengo errores, por ej.

 class ForumService @Autowinetworking constructor(repository: ForumRepository) : GenericKotlinService<Forum>(repository) { open fun findByName(name: String) = repository.findByName(name) } 

o

 class ForumService : GenericKotlinService<Forum> { @Autowinetworking constructor(repository: ForumRepository) : super(repository) open fun findByName(name: String) = repository.findByName(name) } 

El error es

 requinetworking CrudRepository<Forum, Long> but got a ForumRepository. 

Cuando utilizo el siguiente java GenericService:

 public abstract class GenericService<T> { private final CrudRepository repository; public GenericService(CrudRepository repository) { this.repository = repository; } public T findOne(Serializable id) { return (T) repository.findOne(id); } public void delete(Serializable id) { repository.delete(id); } } 

y usa este en el Foro de Servicio:

 class ForumService @Autowinetworking constructor(val repository: ForumRepository) : GenericService<Forum>(repository) { open fun findByName(name: String) = repository.findByName(name) } 

Todo funciona. No veo cómo puedo usar mi GenericKotlinService en su lugar?

El asunto es que ForumRepository no es CrudRepository<Any, Serializable> . Pero puede ser convertible a CrudRepository<Any, Serializable> si ambos parameters de tipo están en posiciones de out . Entonces puedes definir el CrudRepository de la siguiente manera

 interface CrudRepository<out T, out U> 

o acepte CrudRepository out parameters de tipo en el constructor GenericKotlinService

 abstract class GenericKotlinService<T>( val repository: CrudRepository<out Any, out Serializable> ) 
  • Dónde poner index.html en un proyecto de Kotlin-js?
  • Diferenciar extensiones ambiguas en Kotlin
  • ¿Qué es la testing (0) en este fragment de kotlinlang.org?
  • android.view.InflateException: file XML binary línea # 32: file XML binary línea # 32: class de inflado de error
  • Android: refactoriza muchos grupos de botones de radio en una actividad
  • ¿Qué significa el tipo de devolución de Vacío en Kotlin?
  • ¿Cómo verificar que la image haya cambiado si no hay cambios en el código HTML?
  • Lista de sorting basada en el order de otra list
  • ¿Es posible crear constructores de extensiones en Kotlin?
  • Servicios permanentes en android oreo
  • Compartir código entre plataforms / idiomas (por ejemplo, Swift, Kotlin, JavaScript)