5

我是一名 Java Android 开发人员,我正在接近 Kotlin

我定义了以下类:

open class Player : RealmObject() {
    ...
}

我定义了以下两个扩展,一个用于通用 RealmObject 类,一个用于特定 Player 类:

fun RealmObject.store() {
    Realm.getDefaultInstance().use { realm ->
        realm.beginTransaction()
        realm.copyToRealmOrUpdate(this)
        realm.commitTransaction()
    }
}

fun Player.store(){
    this.loggedAt = Date()
    (this as RealmObject).store()
}

我想要的是,如果我调用.store()任何RealmObject对象,RelamObject.store()则将调用扩展名,但如果我调用实例,则将调用的扩展名将.store()是. (暂时没问题)我不想复制粘贴相同的代码,我喜欢少写重用。所以我需要在内部调用泛型PlayerPlayer.store()Player.store()RealmObject.store()

我知道了。我在那里写的代码实际上按预期工作:D

我要问的是(只是因为我只是凭个人直觉写的):

这是好方法吗?!或者有什么更好的方法?

谢谢

4

1 回答 1

2

您的方法似乎完全正确,因为它完全符合需要。Kotlin 根据接收者表达式的静态(推断或声明)类型解析扩展调用,并且强制转换(this as RealmObject)生成静态表达式类型RealmObject

另一种有效的方法是使用对另一个扩展的可调用引用,我不确定这是否更好:

fun Player.store(){
    this.loggedAt = Date()
    (RealmObject::store)(this)
}
于 2017-08-03T16:58:49.007 回答