Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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_Akka - Fatal编程技术网

Scala 在这个代码示例中可以使用咖喱吗?

Scala 在这个代码示例中可以使用咖喱吗?,scala,akka,Scala,Akka,考虑下面的Akka演员。此参与者的实现应该需要重写并实现handleMessage(message:T)。此实现应在其最后一行调用executeQueryLookup abstract class BaseQueryLookupActor[T, U] extends Actor { def receive = { case message: T => handleMessage(message) case message => unhandled(message

考虑下面的Akka演员。此参与者的实现应该需要重写并实现
handleMessage(message:T)
。此实现应在其最后一行调用
executeQueryLookup

abstract class BaseQueryLookupActor[T, U] extends Actor {

  def receive = {
    case message: T => handleMessage(message)
    case message => unhandled(message)
  }

  def handleMessage(message: T) // Abstract method

  def executeQueryLookup(cacheName: String, queryName: String, params: Map[String, String])  {
    // Concrete method that contains query logic
  }
}
我意识到有多种方法可以在不使用任何Scala函数概念的情况下实现这一点,但我认为也可以通过使用部分函数或curry实现这一点。
如果是这样的话,我将如何实现这一点?

我不确定我是否遵循,但定义它是否有效

def handleMessage(message: T): (String, String, Map[String, String])
然后在基类中自己调用
executeQueryLookup
,如

def receive = {
  case message: T =>
    val (cacheName, queryName, params) = handleMessage(message)
    executeQueryLookup(cacheName, queryName, params)
  case message => unhandled(message)
}

如果将实现方法的任务留给子类,然后调用该方法,则超类无法强制子类中的实现执行某些特定操作。这与我们的工作无关


由于JVM上的泛型类型
T
被擦除,因此您的actor还有另一个问题:在运行时
T=java.lang.Object
。因此,匹配将始终成功,第二种情况将永远不会被调用。您必须在创建参与者时以及在每条消息中都进行传递。一个粗略的近似方法是使用
classTag
,因为每个JVM对象都有一个
.getClass
方法,但这只会匹配最外层的类型,如果您想区分
List[Int]
List[String]

中的
List[String]
是可行的,但不是我所想的,我想可能会有一个讨好的机会,但似乎不是。我会试试这个,谢谢