Kotlin简单泛型函数编译错误(*)
我做了一个简单的函数sqr,但它不工作,怎么了Kotlin简单泛型函数编译错误(*),kotlin,Kotlin,我做了一个简单的函数sqr,但它不工作,怎么了 fun <T : Number> sqr(value: T): T { return value * value } fun main() { print("${sqr(5)}") } funsqr(值:T):T{ 返回值*值 } 主要内容(){ 打印(${sqr(5)}) } Number是对Double、Int等的抽象,但它不包括任何常见行为。相反,它包含在不同具体类型之间转换的功能 查看源代码(
fun <T : Number> sqr(value: T): T {
return value * value
}
fun main() {
print("${sqr(5)}")
}
funsqr(值:T):T{
返回值*值
}
主要内容(){
打印(${sqr(5)})
}
Number
是对Double
、Int
等的抽象,但它不包括任何常见行为。相反,它包含在不同具体类型之间转换的功能
查看源代码(或按IDE中的“转到实现”)
您必须将它们转换为一个具体的子类,以便对其进行编译:
fun <T : Number> sqr(value: T): T {
return value.toInt() * value.toInt()
}
funsqr(值:T):T{
返回值.toInt()*值.toInt())
}
Number
是对Double
、Int
等的抽象,但它不包括任何常见行为。相反,它包含在不同具体类型之间转换的功能
查看源代码(或按IDE中的“转到实现”)
您必须将它们转换为一个具体的子类,以便对其进行编译:
fun <T : Number> sqr(value: T): T {
return value.toInt() * value.toInt()
}
funsqr(值:T):T{
返回值.toInt()*值.toInt())
}
对于数字
没有时间
函数(将*
运算符转换为该函数)
Number
只是Int
、Float
、Double
等的抽象超类,只包含抽象转换函数:toInt()
、toFloat()
等
那么,如何绕过这个问题,并为所有这些问题提供一个sqrt
函数呢
因为它们没有包含基本操作的超级类型,所以最好的办法是为每个类型单独实现,而不使用泛型类型
fun sqr(value: Int) = value * value
fun sqr(value: Float) = value * value
fun sqr(value: Double) = value * value
// ...
对于编号
,没有时间
函数(将*
运算符转换为该函数)
Number
只是Int
、Float
、Double
等的抽象超类,只包含抽象转换函数:toInt()
、toFloat()
等
那么,如何绕过这个问题,并为所有这些问题提供一个sqrt
函数呢
因为它们没有包含基本操作的超级类型,所以最好的办法是为每个类型单独实现,而不使用泛型类型
fun sqr(value: Int) = value * value
fun sqr(value: Float) = value * value
fun sqr(value: Double) = value * value
// ...
或者,您可以利用kotlin smartcasts在数字上设置操作员扩展;可能看起来像这样:
operator fun Number.times(value: Number): Number {
return when(this) {
is Int -> this * value.toInt()
is Double -> this * value.toDouble()
is Short -> this * value.toShort()
is Float -> this * value.toFloat()
else -> throw IllegalArgumentException("Value is not a number")
}
}
所以你的平方函数是:
fun sqr(value: Number): Number {
return value * value
}
我想这里的好处是,您只维护1个平方函数,以及一个具有多个案例的运算符,这些案例表示您希望支持的具体数字类。或者,您可以使用kotlin smartcasts对数字进行运算符扩展;可能看起来像这样:
operator fun Number.times(value: Number): Number {
return when(this) {
is Int -> this * value.toInt()
is Double -> this * value.toDouble()
is Short -> this * value.toShort()
is Float -> this * value.toFloat()
else -> throw IllegalArgumentException("Value is not a number")
}
}
所以你的平方函数是:
fun sqr(value: Number): Number {
return value * value
}
我想这里的好处是您只维护1个平方函数,以及一个具有多个案例的运算符,这些案例表示您希望支持哪些具体的数字类