我创建了Value Class
final class Feature(val value: Vector[Double]) extends AnyVal
match
中针对该类的scala
:
val d = new Feature(Vector(1.1))
s match {
case a:Feature => println(s"a:feature, $a")
case _ => println("_")
}
这项工作正常,但在Akka
中,与上面相同的类,在receive
方法中,这不起作用:
def receive = LoggingReceive {
case a:Feature =>
log.info("Got Feature: {}", a)
case _ => println("_")
}
当我执行代码时,虽然我发送的是Feature
,但正在执行的case
语句是case _ => println("_")
,但是,如果我将代码更改为:
def receive = LoggingReceive {
case a:Feature =>
log.info("Got Feature: {}", a)
case b:Vector[_] =>
log.info("GOT FEATURE")
case _ => println("_")
}
case b:Vector[_]
已执行。
Akka文档提到:
实例化actor道具的推荐方法是在运行时使用反射来确定正确的actor构造 - 当所述构造函数接受参数时,不支持由于技术限制而调用的tor 价值类。在这些情况下,您应该通过调用构造函数来解包参数或创建props 手动:
但是不要提及与Value classes
感谢YuvalItzchakov的帮助。演员的代码如下:
def receive = LoggingReceive {
case Feature(a) =>
log.info("Got feature {}", a)
// ....
}
def receive = LoggingReceive {
// ..
case json: JValue =>
log.info("Getting json response, computing features...")
val features = Feature(FeatureExtractor.getFeatures(json))
log.debug(s"Features: $features")
featureListener.get ! features
// ..
}
答案 0 :(得分:2)
由于值类的工作方式,您的示例都会导致Feature
的分配。一旦由于模式匹配示例中的运行时检查,另一个由于receive
的签名而需要Any
作为输入类型。
由docs for Value Classes指定(强调我的):
分配摘要
在以下情况下实际实例化值类:
- 将值类视为另一种类型。
- 将值类分配给数组。
- 执行运行时类型测试,例如模式匹配。
这意味着,如果您看到Vector[_]
类型,则表示您实际从代码中的某个位置传递了具体向量。