Kotlin 中的泛型和内联函数

Generics and inline fuctions in Kotlin

我在 Kotlin 中使用泛型有困难。 我想制作通用接口和实现以及几个特定类型的 DAO。

// Type parametrized DAO
interface DaoInterface<T : Any> {
    fun <T : Any> getByCollectionId(collectionId: Long, clazz: Class<T>): List<T>
}

//Generic DAO implementation
open class DaoInterfaceImpl<T : Any>(private val entityManager: EntityManager) : DaoInterface<T> {
    override fun <T : Any> getByCollectionId(collectionId: Long, clazz: Class<T>): List<T> =
        entityManager.createQuery(
            "from ${clazz.name} c where c.collectionId = :collectionId", clazz
        )
            .apply { setParameter("collectionId", collectionId) }
            .resultList ?: listOf()

    inline fun <reified T : Any> getByCollectionId(collectionId: Long): List<T> =
        getByCollectionId(collectionId, T::class.java)
}

//Type specified DAO
class TestContactDao(entityManager: EntityManager) : DaoInterface<Contacts>, DaoInterfaceImpl<Contacts>(entityManager)

class Test(private val testContactDao: TestContactDao) {
    fun call() {
        val result1 = testContactDao.getByCollectionId<Contacts>(123L)
        val result2 : List<Contacts> = testContactDao.getByCollectionId(123L)
        val result3 = testContactDao.getByCollectionId(123L)
    }
}

result1 和 result2 工作正常,但在 result3 中出现“类型推断失败”错误。

我不想在这些调用中指定泛型(比如在结果 1 和 2 中)。我想为不同的 类(联系人、地址和其他)创建多个 DAO,并像在 result3 中那样调用它们。

我该怎么做?

问题是您的具体化 T 与 class 类型 T 不匹配,因为您重新定义了该类型变量。您仍然可以通过在接口上定义扩展函数来避免必须传递 Class

// helper extension to simplify access
inline fun <reified T> DaoInterface<T>.getByCollectionId(collectionId: Long): List<T> = getByCollectionId(collectionId, T::class.java)

为什么这行得通?这里我们定义 T 为 reified 并指定 DaoInterface 必须是相同的类型 T.

我有一个在这里工作的游乐场示例:https://pl.kotl.in/kLiM9xD3y