scala - SCALA:如何构造一个可以隐式接受任何 Int、Long 或 BigInt 的复合类型
问题描述
假设我想要一个 Type T 这样如果我输入
斯卡拉 REPL :
val x:T = 34
x: BigInt = 34
val y:T = 34L
y: BigInt = 34
val z:T = BigInt(34)
z: BigInt = 34
这意味着我需要使用 Int、Long 和 BigInt 类型构造一个 Type T,它在 SCALA REPL 中返回为 BigInt。或者更好,即使我得到:
val x:T = 34
x: T = 34
val y:T = 34L
y: T = 34
val z:T = BigInt(34)
z: T = 34
解决方案
BigInt
是你的T
类型。Scala 为此内置了隐式转换。例如
val x: BigInt = 34
val y: BigInt = 34L
val z: BigInt = BigInt(34)
都会工作。
如果您想要与 BigInt 不同的类型,则可以使用隐式转换
import scala.language.implicitConversions
class BigIntWrapper(val value: BigInt) extends AnyVal
implicit def IntegralIsBigInt[T: Integral](num: T): BigIntWrapper = {
val ev = implicitly[Integral[T]]
new BigIntWrapper(BigInt(ev.toLong(num)))
}
val a: BigIntWrapper = 4
val b: BigIntWrapper = 4L
推荐阅读
- javascript - Python selenium 复选框元素单击
- shopify - 如何从 Shopify 架构中删除块部分
- mysql - 加载本地数据文件的解决方法?
- terraform - 文件夹中有多个 .tf 文件
- reactjs - 为什么只有数组动画中的最后一个组件?
- r - 使用线性模型在矩阵中估算 NA 值
- visual-studio - 如何统一排序动画
- html - 对齐图形及其文本/图形标题
- vapor - Vapor 3 在 Leaf 中渲染复杂的调用
- docker - 在 macOSX 上远程使用 docker-compose 时出现 CryptographyDeprecationWarning