作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个函数,如果数字的接收者为空,则返回默认值。但是,当我检查接收值的类型时,它与接收器不匹配,而是与我作为参数传递的默认值匹配。
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
fun <T : Number, J : Number> T?.orDefault(value: J): T = this ?: (value as T)
Int
接收器将接受
Double
默认并转换为
Int
返回。
最佳答案
在您的第一种情况下,orDefault()
期望接收器和参数具有相同的类型( T
)。所以当你用 Double
调用它时接收器和 Int
参数,编译器为类型参数 Number
推断它们最接近的公共(public)父类(super class) ( T
) .然后它返回给定的 Int
如您所见,直接。
尽管您的第二种情况看起来更像您想要的,但我认为它仍在推断 Number
对于 T
,所以类型转换没有任何效果。
归根结底,我认为你不能只用一个扩展功能做你想做的事。您不能转换 Int
到 Double
在 Kotlin 中(与 Java 不同);你需要调用它的toDouble()
方法。而且您需要为每种接收器类型单独编码。
关于generics - Kotlin 泛型返回类型与接收者匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53975552/
我是一名优秀的程序员,十分优秀!