0

我有一个CoordVector接受的类,我在别处定义的类Vector[ComplexNumber]在哪里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) {
    ...
}

不幸的是,我不能只替换DoubleNumeric,但是有没有一种简单的方法可以做到这一点,而不必为每个数字类型创建一个新的implicit defand ?apply

4

1 回答 1

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但您可以创建RealVector具有类型的构造函数参数的实例Vector[Int],或Vector[Long],或Vector[Float]等。

于 2017-08-25T22:53:43.047 回答