具有Generic的Kotlin扩展功能不适用于Any吗?

时间:2018-06-21 09:52:13

标签: android generics kotlin realm extension-function

我想拥有RealmList类的扩展功能:

private inline fun RealmList<Any?>.saveAll() {
    this.forEach {
        item -> Realm.getDefaultInstance().insert(item!! as RealmModel)
    }
}

但是每当我使用它时,都会出现此错误:

enter image description here

3 个答案:

答案 0 :(得分:1)

要实现此目的,请将 out 添加到扩展功能的通用声明中。 如果在RealmList

中声明了这样的声明,那将是可行的
private inline fun RealmList<out Any?>.saveAll() {
    this.forEach {
        item -> Realm.getDefaultInstance().insert(item!! as RealmModel)
    }
}

答案 1 :(得分:0)

您的代码通常不安全。请修正您的代码,阅读文档,诸如此类。

此外,RealmList需要? extends RealmModel,因此您需要将T: RealmModelout一起使用。

fun <T: RealmModel> RealmList<out T?>.saveAll() {
    Realm.getDefaultInstance().use { realm ->
        val wasInTransaction = realm.isInTransaction()
        try {
            if(!wasInTransaction) {
                realm.beginTransaction()
            }
            this.forEach {
                item -> item?.let { realm.insert(it) }
            }
            if(!wasInTransaction) {
                realm.commitTransaction()
            }
        } catch(e: Throwable) {
            if(realm.isInTransaction()) {
                realm.cancelTransaction()
            }
        }
    }
}

答案 2 :(得分:-1)

也许您应该使用Realms方法插入而不是执行循环?这样,您的扩展程序就可以轻松调用:

fun <T: RealmModel> RealmList<out T?>.saveAll() = Realm.getDefaultInstance().insert(this)