Scala,参数化特征的具体实现的反映

时间:2012-06-08 09:37:59

标签: java scala cqrs parameterized

我想看看在以下情况下是否有任何解决类型擦除的方法:

我有一个特质

trait IHandle[T <: ICommand] {
    def handle(command: T) : Unit
}

我希望找到使用反射的具体实现说

IHandle[MyCommand]

可能看起来像

class MyCommandHandler(dependency:Dependency) extends IHandle[MyCommand] {
  def handle(command:MyCommand): Unit = ...
}

(我正在玩CQRS模型中创建一个命令调度程序,我很高兴听到这是一个完全错误的方法来接受Scala并且愿意接受建议)

1 个答案:

答案 0 :(得分:2)

你可以使用Manifest,但我强烈建议避免在Scala中使用这样的东西......这绝对是IMO的错误做法。

基本上你需要一个注册表(可能是Map[Manifest[_], IHandle[_]],你可以在那里存储所有的实现,然后你可以在注册表中查找。

def store[T : Manifest](handle: Handle[T]) = map.put(manifest[T], handle)
def lookup[T : Manifest] = map.get(manifest[T])

// And then ...
store(new Handle[Foo])
lookup[Foo]

正确的方法可能意味着类型类的使用(尝试google),很难真正给你一个完整的解决方案,而不必了解你正在做的事情...即使我也在做关于Scala的一些CQRS开发。

请不要犹豫,连接到freenode服务器上的#scala频道进行聊天。