SCALA:如何构造可以隐式接受Int,Long或BigInt中的任何一个的复合类型

时间:2018-07-06 07:10:58

标签: scala types

假设我想要输入T,如果我输入

SCALA 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

1 个答案:

答案 0 :(得分:2)

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