代码之家  ›  专栏  ›  技术社区  ›  RAGHHURAAMM

scala:如何构造可以隐式接受int、long或bigint中任何一个的复合类型

  •  1
  • RAGHHURAAMM  · 技术社区  · 6 年前

    假设我想要一个T型,如果我输入

    scala回复:

      val x:T = 34
      x: BigInt = 34
    
      val y:T = 34L
      y: BigInt = 34
    
      val z:T = BigInt(34)
      z: BigInt = 34
    

    这意味着我需要使用in t、long和bigint类型构造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 回复  |  直到 6 年前
        1
  •  2
  •   fusion    6 年前

    BigInt T

    val x: BigInt = 34
    
    val y: BigInt = 34L
    
    val z: BigInt = BigInt(34)
    

    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