Generic 的 Kotlin 扩展功能不适用于 Any?
Kotlin extension function with Generic doesn't work with Any?
我想要 RealmList 的扩展函数 class:
private inline fun RealmList<Any?>.saveAll() {
this.forEach {
item -> Realm.getDefaultInstance().insert(item!! as RealmModel)
}
}
但是每次我用的时候,都会出现这个错误:
要实现这一点,请将 out 添加到扩展函数的通用声明中。
如果在 RealmList
中声明这样的声明,它将起作用
private inline fun RealmList<out Any?>.saveAll() {
this.forEach {
item -> Realm.getDefaultInstance().insert(item!! as RealmModel)
}
}
也许您应该使用 Realms 方法来插入而不是执行循环?这样你的分机就变成了一个简单的调用:
fun <T: RealmModel> RealmList<out T?>.saveAll() = Realm.getDefaultInstance().insert(this)
您的代码通常不安全。请修复您的代码,阅读文档,诸如此类。
此外,RealmList 需要 ? extends RealmModel
,因此您需要将 T: RealmModel
与 out
一起使用。
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()
}
}
}
}
我想要 RealmList 的扩展函数 class:
private inline fun RealmList<Any?>.saveAll() {
this.forEach {
item -> Realm.getDefaultInstance().insert(item!! as RealmModel)
}
}
但是每次我用的时候,都会出现这个错误:
要实现这一点,请将 out 添加到扩展函数的通用声明中。
如果在 RealmList
private inline fun RealmList<out Any?>.saveAll() {
this.forEach {
item -> Realm.getDefaultInstance().insert(item!! as RealmModel)
}
}
也许您应该使用 Realms 方法来插入而不是执行循环?这样你的分机就变成了一个简单的调用:
fun <T: RealmModel> RealmList<out T?>.saveAll() = Realm.getDefaultInstance().insert(this)
您的代码通常不安全。请修复您的代码,阅读文档,诸如此类。
此外,RealmList 需要 ? extends RealmModel
,因此您需要将 T: RealmModel
与 out
一起使用。
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()
}
}
}
}