首页 > 解决方案 > 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

标签: scalatypes

解决方案


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

推荐阅读