不了解 Kotlin 与泛型的结合。
我试图将我的一些 Java 转向 kotlin。其中几个类是 spring-data 存储库 以及将存储库类型作为通用参数的通用服务,例如:
@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>
如果两个类型参数都在 out
中职位。因此您可以定义 CrudRepository
通过以下方式
interface CrudRepository<out T, out U>
或接受CrudRepository
与 out
在 GenericKotlinService
中键入参数构造函数
abstract class GenericKotlinService<T>(
val repository: CrudRepository<out Any, out Serializable>
)
关于generics - Kotlin 和泛型构造函数让我感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36990972/