Scala 为混合特性的所有类构建操作
使用Scala Play 2.3 我有一个模型案例类的集合&实现 特殊特征-DummyDataScala 为混合特性的所有类构建操作,scala,types,playframework-2.0,traits,boilerplate,Scala,Types,Playframework 2.0,Traits,Boilerplate,使用Scala Play 2.3 我有一个模型案例类的集合&实现 特殊特征-DummyData trait DummyData[T] { def dummy(idx: Long): T def dummy(idxs: List[Long]): List[T] = { for {idx <- idxs} yield dummy(idx) } } case class Location(locationIdx: Long) case class Vehicle(vehi
trait DummyData[T] {
def dummy(idx: Long): T
def dummy(idxs: List[Long]): List[T] = {
for {idx <- idxs} yield dummy(idx)
}
}
case class Location(locationIdx: Long)
case class Vehicle(vehicleIdx: Long, mileage: Long)
object Location extends ...
with DummyData[Location]
{
def dummy(idx: Long) = {
SubscriberLocation(idx, "name-" + idx)
}
}
object Vehicle extends...
with DummyData[Vehicle]
{
...
}
除了一个单词外,每个动作都是重复代码
我希望能够做出一个动作,为任何人提供虚拟数据
类,该类混合了DummyData特性。所以我需要定义一个方法
像这样:
def dummyAction[T <: DummyData](modelCompanion: T) = {
Action { implicit request =>
Ok(Json toJson modelCompanion.dummy(dummyIdxs))
}
}
然后通过简单的调用就能做出新的动作
def locationDummy = dummyAction[Location]
或
我应该使用什么样的scala特性来实现这一点?我需要退后一步,改变这种特质吗
我已经尝试过这种方法的几种变体,但最常遇到的错误是DummyData需要类型参数。如果我可以修改trait,使其不需要类型参数,那将是一个受欢迎的解决方案,但我认为这是必要的,您需要的是一个称为“存在类型”的特性。你可以读一个像样的解释(这不是一个微不足道的概念,所以我还没有找到一个神奇的博客,可以马上把它说清楚) 下面的代码执行您想要的操作并打印“3”
trait DummyData[T]{
def虚拟(idx:长):T
def虚拟(idxs:List[Long]):List[T]={
对于{idx
object DummyActionCreator[T] extends (DummyList[T] => TxAction) {
def apply(model: DummyList[T]) = TxAction { implicit request =>
Ok(Json toJson model.dummy(dummyIdxs))
}
}
def locationDummy = dummyAction[Location]
def locationDummy = dummyAction(Location)
trait DummyData[T] {
def dummy(idx: Long): T
def dummy(idxs: List[Long]): List[T] = {
for {idx <- idxs} yield dummy(idx)
}
}
object Test extends DummyData[Int]
{
override def dummy(idx: Long): Int = 3
}
def dummyAction(modelCompanion: DummyData[T] forSome { type T}) =
{
modelCompanion.dummy(3)
}
def main(args: Array[String]): Unit =
{
val dummy3 = dummyAction(Test)
print(dummy3)
}