【问题标题】:How can I get my overloaded constructor to accept any numeric type?如何让我的重载构造函数接受任何数字类型?
【发布时间】:2017-08-25 22:09:05
【问题描述】:

我有一个接受Vector[ComplexNumber]CoordVector 类,其中ComplexNumber 是我在其他地方定义的一个类,并且我也将其覆盖以接受Vector[Double]。但我希望覆盖改为接受 Scala 中的任何数字类型。

这是我当前的代码

case class RealVector(vector: Vector[Double])
case class ComplexVector(vector: Vector[ComplexNumber])

import scala.language.implicitConversions
implicit def dv(vector: Vector[Double]) = RealVector(vector)
implicit def cv(vector: Vector[ComplexNumber]) = ComplexVector(vector)

object CoordVector {
    def apply(components:RealVector):CoordVector = {
        new CoordVector(components.vector.map(c => ComplexNumber(c, 0)))
    }
}

case class CoordVector(val components:ComplexVector) {
    ...
}

很遗憾,我不能只用Numeric 替换Double,但是有没有一种简单的方法可以做到这一点,而不必为每个数字类型创建一个新的implicit defapply

【问题讨论】:

    标签: scala types constructor-overloading


    【解决方案1】:

    看看这是否符合你的要求。

    class ComplexNumber(a:Double, b:Double) // put here just to make the rest compile
    
    case class RealVector[N:Numeric](vector: Vector[N])
    case class ComplexVector(vector: Vector[ComplexNumber])
    
    import scala.language.implicitConversions
    implicit def dv[N:Numeric](vector: Vector[N]) = RealVector(vector)
    implicit def cv(vector: Vector[ComplexNumber]) = ComplexVector(vector)
    
    object CoordVector {
      def apply[N:Numeric](components:RealVector[N]):CoordVector = {
        new CoordVector(components.vector.map(c =>
          new ComplexNumber(implicitly[Numeric[N]].toDouble(c), 0)))
      }
    }
    
    case class CoordVector(components:ComplexVector) {
      ???
    }
    

    这允许所有基础数​​字数据为Double,但您可以使用Vector[Int]Vector[Long]Vector[Float]等类型的构造函数参数创建RealVector实例。

    【讨论】:

    • 是的,有效!我实际上尝试了类似的东西,但没有奏效。我缺少的是implicitly[Numeric[N]].toDouble(c)(我只有c)。你能解释一下为什么我需要那部分吗?
    • 编译器知道c的类型在Numeric家族中,但其他很少,所以不能对其进行操作(+,*,/等)或强制转换(c.toDouble)。但它不会编译,除非在c 确实是Numeric 的范围内有隐含的“证据”。所以你要做的就是拉入那个“证据”代码并要求它对c的值进行操作。
    猜你喜欢
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多