interface Marker<T : BaseFoo> {
    fun getSpecialFoo(): List<T>
}

@Dao
interface FooDao: Marker<Foo> {
    @Query("SELECT * FROM foo WHERE bar = :bar")
    fun get(bar: Int): List<Foo>

    @Transaction
    override fun getSpecialFoo(): List<Foo> {
        return get(1)
    }
}

这导致

抽象DAO方法必须使用以下注释之一进行注释:插入、删除、查询、更新和查询

However, Marker is not marked with @Dao and FooDao override getSpecialFoo already. Why does this error still show?

我需要Marker个,因为我需要一个具有一些方法的泛型DAO.有什么办法可以解决这个问题吗?

我能想到的唯一方法是将dao标记为Any,并转换类型runtime或为dao构建包装器.

推荐答案

这似乎是房间图书馆的局限性.您可以按如下方式解决此问题.

@Dao
interface FooDao {
    @Query("SELECT * FROM foo WHERE bar = :bar")
    fun get(bar: Int): List<Foo>

    @Transaction
    fun getSpecialFoo(): List<Foo> {
        return get(1)
    }
}

fun FooDao.wrapper(): Marker<Foo> {
    return Wrapper(this)
}


private class Wrapper(private val dao: FooDao): Marker<Foo> {
    override fun getSpecialFoo() = dao.getSpecialFoo()
}

当你需要它是Marker<Foo>的时候,你可以用wrapper()来创建一个包装器,用dao来实现Marker<Foo>.

Kotlin相关问答推荐

UByte范围. Min_UTE.. UByte.MAX_UTE不符合预期

Compose:LaunchedEffect在密钥更改后不会重新启动

Kotlin协程挂起继续线程

为什么Kotlin函数参数名会 destruct 方法调用?

我需要后台工作才能使用卡夫卡的消息吗?

KTOR';S函数`staticResources`在Kotlin本机目标上不可用

Kotlin接口方法默认值&;可传递依赖项

如何将 `when` 与 2 个密封类一起使用并获取内部值?

在jetpack compose中将默认方向设置为横向?

在 kotlin 中重载函数时,我在一些非常基本的代码上不断收到类型不匹配

如何在 Kotlin 中实现 Composition UML 关系?

奇怪的 cotlin check Not Null 参数错误

如何从kotlin中的ArrayList中删除所有元素

使用 Kotlin 创建新目录,Mkdir() 不起作用

Foo::class.java 和 Foo::javaClass 有什么区别?

如何暂停kotlin coroutine直到收到通知

Dagger +Kotlin 不注入

如何在Kotlin中将字符串转换为InputStream?

判断EditText是否为空kotlin android

Kotlin类型安全类型别名