如何让我的重载构造函数接受任何数字类型?
How can I get my overloaded constructor to accept any numeric type?
我有一个 CoordVector
class 接受 Vector[ComplexNumber]
,其中 ComplexNumber
是我在别处定义的 class,我也将其覆盖为接受 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 def
和 apply
对于每种数字类型?
看看这是否符合您的要求。
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[Long]
类型的构造函数参数创建 RealVector
个实例=15=],等等
我有一个 CoordVector
class 接受 Vector[ComplexNumber]
,其中 ComplexNumber
是我在别处定义的 class,我也将其覆盖为接受 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 def
和 apply
对于每种数字类型?
看看这是否符合您的要求。
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[Long]
类型的构造函数参数创建 RealVector
个实例=15=],等等