Kotlin简单泛型函数编译错误(*)

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等的抽象,但它不包括任何常见行为。相反,它包含在不同具体类型之间转换的功能 查看源代码(

我做了一个简单的函数sqr,但它不工作,怎么了

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个平方函数,以及一个具有多个案例的运算符,这些案例表示您希望支持哪些具体的数字类