在Scala中的测试中访问私有变量而不进行强制转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Scala中的测试中访问私有变量而不进行强制转换相关的知识,希望对你有一定的参考价值。
我需要你帮助我解决这个Scala问题。
我有一个类的层次结构:车辆只有每个车辆的公共变量,然后是3个子类:Car,Truck和MotorCycle,每个人都有自己的特定变量。我在辅助对象方法中使用模式匹配来根据车辆类型进行一些转换:
object Transformation {
def someTransformation(vehicle:Vehicle):Vehicle = {
vehicle match {
case Car(<<<vars>>>) => Car(<<< transformed vars>>>)
case Truck(<<<vars>>>) => Truck(<<< transformed vars>>>)
case MotorCycle(<<<vars>>>) => MotorCycle(<<< transformed vars>>>)
}
}
}
我的问题是当我必须测试它时,因为我正在返回一辆车(比如说是一个混合车),我必须每次出现以便进入所涉及的车辆的私人变速器。我想要一种方法来保留这些代码,并且在测试中访问私有成员而不进行投射,因为我知道我作为参数接收的车辆与我返回的车辆的类型相同。这可以通过泛型来解决吗?,怎么样?
谢谢,我希望它是可以理解的。
答案
我想你想要做的是对函数someTransformation
的返回类型进行限制。你希望someTransformation
只返回它被调用的车辆类型。
以下是如何使用上下文边界执行此操作:
trait Vehicle
case class Car(a: Int) extends Vehicle
case class Truck(b: Int) with Vehicle
case class MotorCycle(c: Int) with Vehicle
object Transformation {
trait Transformer[V <: Vehicle] {
def transform(v: V): V
}
implicit val carTransformer = new Transformer[Car] {
override def transform(c: Car): Car = Car(c.a + 1)
}
implicit val truckTransformer = new Transformer[Truck] {
override def transform(t: Truck): Truck = Truck(t.b + 10)
}
implicit val motorCycleTransformer = new Transformer[MotorCycle] {
override def transform(m: MotorCycle): MotorCycle = MotorCycle(m.c + 100)
}
def someTransformation[V <: Vehicle : Transformer](v: V): V = {
implicitly[Transformer[V]].transform(v)
}
}
Transformation.someTransformation(Car(1)) // results in Car(2)
Transformation.someTransformation(Truck(1)) // results in Truck(11)
Transformation.someTransformation(MotorCycle(1)) // results in MotorCycle(101)
以上是关于在Scala中的测试中访问私有变量而不进行强制转换的主要内容,如果未能解决你的问题,请参考以下文章
从‘char *’初始化‘char’从指针生成整数而不进行强制转换