gpt4 book ai didi

generics - Kotlin 泛型返回类型与接收者匹配

转载 作者:行者123 更新时间:2023-12-02 12:42:32 24 4
gpt4 key购买 nike

我正在尝试创建一个函数,如果数字的接收者为空,则返回默认值。但是,当我检查接收值的类型时,它与接收器不匹配,而是与我作为参数传递的默认值匹配。

fun <T : Number> T?.orDefault(value: T): T = this ?: value

使用以下代码测试上述功能:
fun main(args: Array<String>) {
val b: Double? = null
val default : Int = -1
val orDefault = b.orDefault(default)
println(orDefault)
println(orDefault.javaClass.name)
}

输出是这样的:
// Output:
-1
java.lang.Integer

当我通过引入另一个 J 进行尝试时扩展 T ,这仍然失败。使用上述主要方法运行仍然失败。
fun <T : Number, J : T> T?.orDefault(value: J): T = this ?: (value as T)

// Output:
-1
java.lang.Integer

在任何情况下,它都不会返回 double 数。这里有什么问题?

编辑 :

我最终做了这样的事情:
fun <T : Number, J : Number> T?.orDefault(value: J): T = this ?: (value as T)

这样,它确保返回类型与接收者类型相同。然而,唯一的失败是 Null Int接收器将接受 Double默认并转换为 Int返回。

最佳答案

在您的第一种情况下,orDefault()期望接收器和参数具有相同的类型( T )。所以当你用 Double 调用它时接收器和 Int参数,编译器为类型参数 Number 推断它们最接近的公共(public)父类(super class) ( T ) .然后它返回给定的 Int如您所见,直接。

尽管您的第二种情况看起来更像您想要的,但我认为它仍在推断 Number对于 T ,所以类型转换没有任何效果。

归根结底,我认为你不能只用一个扩展功能做你想做的事。您不能转换 IntDouble在 Kotlin 中(与 Java 不同);你需要调用它的toDouble()方法。而且您需要为每种接收器类型单独编码。

关于generics - Kotlin 泛型返回类型与接收者匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53975552/

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