gpt4 book ai didi

kotlin - Kotlin通用约束-要求参数与其他参数具有相同的类型

转载 作者:行者123 更新时间:2023-12-02 12:47:20 25 4
gpt4 key购买 nike

假设我有两个像这样的pojo:

data class Test (
var id : Long? = null
)

data class TestOther (
var id : Long = 0,
var isCool : Boolean = false
}

然后我有一个infix函数,如下所示:
infix fun <T : Any?> KProperty<T>.equal(rhs : KProperty<T>) = BinaryExpression<Boolean>(this, rhs, EQUALS)

然后这可以正常工作:
Test::id equal TestOther::id

但是这样做也是,因为T是所有扩展Any?的类型:
Test::id equal TestOther::isCool

无论如何,有没有指定通用约束,以便可以比较可为空和不能为空的类型,但是不同类型的对象不能不必为每种可能的具体类型都指定重载?

最佳答案

目前无法执行。您可以关注此问题以获取更多详细信息
https://youtrack.jetbrains.com/issue/KT-13198

我在这里看到一种解决方法(类似于该问题中的解决方法)。这个想法是将KProperty<R>包装到一个包装器类中而没有差异。如您所见,KProperty类型具有out R方差,在示例中与我们相反。您可以点击链接以获取有关Kotlin中声明方差异的详细信息
https://kotlinlang.org/docs/reference/generics.html#declaration-site-variance

解决方法按照预期的那样严格

class KWrapper<R>(val p : KProperty<R>)
infix fun <T : KWrapper<R>, R> T.equal(rhs : T) = false
val <T> KProperty<T>.wrap get() = KWrapper(this)

val a = Test::id.wrap equal TestOther::id.wrap //fails: Long vs Long?
val b = Test::id.wrap equal Test::id.wrap //works
val c = Test::id.wrap equal TestOther::isCool.wrap // fails Long vs Boolean

缺点是您需要分别为左参数和右参数使用 .wrap扩展属性(或扩展功能)

关于kotlin - Kotlin通用约束-要求参数与其他参数具有相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54779553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com