Scala 在这个代码示例中可以使用咖喱吗?
考虑下面的Akka演员。此参与者的实现应该需要重写并实现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
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]
是可行的,但不是我所想的,我想可能会有一个讨好的机会,但似乎不是。我会试试这个,谢谢