Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为混合特性的所有类构建操作_Scala_Types_Playframework 2.0_Traits_Boilerplate - Fatal编程技术网

Scala 为混合特性的所有类构建操作

Scala 为混合特性的所有类构建操作,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

使用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(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)
  }