我已经遇到过这个问题好几次了:
我有一个计算某些东西的函数,可以说
def square(n: Int): Int = n * n
Run Code Online (Sandbox Code Playgroud)
(非常简单的例子,但这就可以了)
然后我对另一种数据类型有相同的“算法”,可以说很长:
def square(n: Long): Long = n * n
Run Code Online (Sandbox Code Playgroud)
然后是 BigInt、Short、Byte 等。
如果我的算法比这个例子更复杂、更长,我就会有很多代码重复。
我想要的是一个通用定义,例如:
def square[T :> AnyVal](n: T): T = n * n
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为在 hirachy 类中,在 AnyVal 与 Int、Long 和 Float 之下还有 Boolean 和 Unit。对于布尔值和单位,术语 n * n 没有意义,我得到一个编译器错误(正确)。
我只希望我的函数适用于“可计算”数据类型,如 Int、Long、Float...,它们具有所有常见的数学运算符,如 +、*、/、< 等,然后用此制定我的算法或计算一次性为所有操作员提供服务。
当然,我可以匹配函数输入变量 n,然后以不同的方式处理每种情况,但我也会像之前一样通过重载重复所有代码。
我尝试创建自己的特征“Computables”,然后扩展到其他类 Int、Long 等,但编译器抱怨“...无法扩展最终类 Int”
这可能吗?我错过了什么吗?