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> ) 
  • Base de datos de Firebase serialize int to enum?
  • Problema de reference no resuelto de Kotlin
  • Firebase-Firestre no carga la información de 2 documentos simultáneamente
  • La versión 1.1.4-eap-77 de Kotlin no funciona
  • El método TaskStackBuilder addParentStack () no funciona
  • ¿Plumando Kotlin para la finalización automática del eclipse?
  • ¿Por qué Kotlin comstack más rápido que Scala?
  • Invoque el comstackdor Kotlin del progtwig Java
  • Kotlin utiliza aserciones de time de ejecución para la comprobación nula - ¿Sobrecarga de performance?
  • Botones de acceso del layout inflados programáticamente dentro de otro layout
  • Kotlin: configuration de un boolean privado en class Java a través de una class de datos en Kotlin. ¿Por qué no puedo hacer esto?