假设我有以下类型
class Foo
trait Bar
Run Code Online (Sandbox Code Playgroud)
有没有办法制作一个接受Type参数T的方法,并确定该T是否为Bar?例如,
def isBar[T <: Foo: Manifest] =
classOf[Bar].isAssignableFrom(manifest[T].erasure)
Run Code Online (Sandbox Code Playgroud)
可悲的是,isBar[Foo with Bar]
是false
因为擦除似乎抹去混入.
而且,manifest[Foo with Bar] <:< manifest[Bar]
是假的
这有可能吗?
我看了这个问题:如何判断Scala的具体类型是否扩展了某个父类?
但是这个答案不适用于混合特征,因为它们似乎被清除,如上所述.
我是Scala和Akka的新手,请原谅我,如果这是一个新问题,但我无法在其他任何地方找到答案......
为了记录我使用Scala 2.9.0-1和Akka 1.1.3并且还包括我的SBT 0.10.1设置.
我在Akka上编写了这条消息后面的代码作为实验; 它是用户数据库和注册设施的玩具版本.基本的想法是有一个UserPool的ActorPool,每个actor都有一个MemoryUserDatabase的实例,它使用STM与用户的电子邮件地址键入的用户地图进行交互 - 非常简单,对吧?
可以通过编译文件并在两个单独的控制台中运行以下内容来重现此问题:
控制台#1:
import toy.service.user._; ServiceRunner.run
控制台#2:
import toy.service.user._; ClientRunner.run
这是服务器控制台的输出(#1)
Aug 31, 2011 5:21:29 PM org.multiverse.api.GlobalStmInstance <clinit>
INFO: Initializing GlobalStmInstance using factoryMethod 'org.multiverse.stms.alpha.AlphaStm.createFast'.
Aug 31, 2011 5:21:29 PM org.multiverse.stms.alpha.AlphaStm <init>
INFO: Created a new AlphaStm instance
Aug 31, 2011 5:21:29 PM org.multiverse.api.GlobalStmInstance <clinit>
INFO: Successfully initialized GlobalStmInstance using factoryMethod 'org.multiverse.stms.alpha.AlphaStm.createFast'.
[ERROR] [8/31/11 5:21 PM] [akka:event-driven:dispatcher:global-3] [LocalActorRef] Availability(foo)
java.lang.NoClassDefFoundError: Could not initialize class toy.service.user.memory.MemoryUserDatabase$
at toy.service.user.memory.MemoryUserDatabase$$anonfun$getUser$1.apply(Registration.scala:96)
at toy.service.user.memory.MemoryUserDatabase$$anonfun$getUser$1.apply(Registration.scala:96)
at toy.service.user.memory.MemoryUserDatabase$$anonfun$getUser$2.apply(Registration.scala:96)
at toy.service.user.memory.MemoryUserDatabase$$anonfun$getUser$2.apply(Registration.scala:96) …
Run Code Online (Sandbox Code Playgroud)