generics - Kotlin 和泛型构造函数让我感到困惑

标签 generics constructor kotlin

不了解 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>

或接受CrudRepositoryoutGenericKotlinService 中键入参数构造函数

abstract class GenericKotlinService<T>(
    val repository: CrudRepository<out Any, out Serializable>
)

关于generics - Kotlin 和泛型构造函数让我感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36990972/

相关文章:

c# - 如何传递一个对象类型来调用泛型方法

Java 泛型 : Question regarding type capture and generated inference using generic methods

C++ 就地构造和后续销毁 : how do I get the right pointer?

c++ - 我有一个类对象作为另一个类的成员,如何初始化为安全的空状态?

validation - Javax 验证 Kotlin 中的自定义枚举约束

generics - 我们可以在 Kotlin 中使用中缀泛型方法吗?

java - 使用泛型制作交换方法

c++ - 在哪些情况下根本没有构造函数,甚至没有默认构造函数?

kotlin - 有官方的Kotlin风格指南吗?

android - MediaStore.Images.Thumbnails.getThumbnail 返回 null