【发布时间】:2015-10-09 15:30:18
【问题描述】:
我试图创建一个简单的特征来拦截从任意参与者接收到的消息,使用可堆叠特征模式。但是在创建Props 时,发现Props(new A with B) 与Props[A with B] 不同。即,第一个变体有效,但第二个变体无效。区别在哪里?
一个最小的例子:https://gist.github.com/ale64bit/df496ec2a43d0ec2ddb3
谢谢!
【问题讨论】:
我试图创建一个简单的特征来拦截从任意参与者接收到的消息,使用可堆叠特征模式。但是在创建Props 时,发现Props(new A with B) 与Props[A with B] 不同。即,第一个变体有效,但第二个变体无效。区别在哪里?
一个最小的例子:https://gist.github.com/ale64bit/df496ec2a43d0ec2ddb3
谢谢!
【问题讨论】:
我不确定行为背后的确切原因,但似乎使用参数化版本不知道如何构造请求类型,而只是构造主类型。 IE。当你打印出你得到的actor内部的实际类时
Props(new FooActor with Interceptor) => Main$$anonfun$1$$anon$1
Props[FooActor with Interceptor] => FooActor
我最好的猜测是ClassTag 或从ClassTag 生成的构建器不理解参数化的FooActor with Interceptor 语法。但是,如果您之前创建了一个混合这两者的新类,它确实可以工作:
class FooActorWithInterceptor extends FooActor with Interceptor
Props[FooActorWithInterceptor] => FooActorWithInterceptor
顺便说一句,我被多次咬伤后发现,应该避免使用参数化版本的 Props。虽然它适用于无参数构造函数版本,但如果您向构造函数添加一些参数Props[A] 将不会在编译时抱怨。同时Props(new A)会给你一个编译错误。
【讨论】: