Котлин и родовые конструкторы оставляют меня озадаченным

Не понимаю Котлина в сочетании с дженериками.

Я пытался переместить часть своего java в сторону kotlin. Пара этих классов – это репозитории с пружинными данными и общий сервис, который принимает в качестве общего параметра тип репозитория, например:

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

Затем 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) } } 

Однако теперь, когда я пытаюсь создать службу, которая использует этот общий сервис с определенным crudRepository, я всегда получаю ошибки, например

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

или

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

Ошибка

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

Когда я использую следующий 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); } } 

и используйте это в ForumService:

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

все работает. Я не вижу, как я могу использовать свой GenericKotlinService?

Дело в том, что ForumRepository не является CrudRepository<Any, Serializable> . Но он может быть конвертирован в CrudRepository<Any, Serializable> если оба параметра типа находятся в положениях. Таким образом, вы можете определить CrudRepository следующим образом

 interface CrudRepository<out T, out U> 

или принять CrudRepository с параметрами GenericKotlinService типа в конструкторе GenericKotlinService

 abstract class GenericKotlinService<T>( val repository: CrudRepository<out Any, out Serializable> ) 
  • Котлин, общее дополнение
  • стандартная двоичная функция maxBy
  • Дисперсия типа Коттина и звездная проекция
  • Метод переопределения общего типа
  • Операторы с нулевым значением, допустимые в общем классе?
  • Обоснованные дженерики в Scala 2.10
  • Как я могу называть класс java как A: extends B реализует C в kotlin
  • Расширение общего класса в Котлине
  • Стандартное отклонение Kotlin с дженериками
  • Kotlin генерирует общий код Java
  • Абстрактный класс Котлина с общим параметром и методами, которые используют тип param
  • Interesting Posts
    Давайте будем гением компьютера.