1

我正在寻找在以下情况下是否有任何方法可以绕过类型擦除:

我有一个特质

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

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

IHandle[MyCommand]

这可能看起来像

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

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

4

1 回答 1

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]

一个正确的方法可能意味着使用类型类(尝试谷歌),如果没有你在做什么的大局,很难真正给你一个完整的解决方案......即使我正在做一些 CQRS 开发在斯卡拉上。

不要犹豫,连接到 freenode 服务器上的#scala 频道来讨论这个问题。

于 2012-06-09T20:51:53.960 回答