Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala,参数化特征的具体实现的反映_Java_Scala_Cqrs_Parameterized - Fatal编程技术网

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

Java Scala,参数化特征的具体实现的反映,java,scala,cqrs,parameterized,Java,Scala,Cqrs,Parameterized,我想看看在以下情况下是否有任何方法可以绕过类型擦除: 我有一个特点 trait IHandle[T <: ICommand] { def handle(command: T) : Unit } 看起来像 class MyCommandHandler(dependency:Dependency) extends IHandle[MyCommand] { def handle(command:MyCommand): Unit = ... } (我正在玩在CQRS模型中创建命令分

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

我有一个特点

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

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

(我正在玩在CQRS模型中创建命令分派器的游戏,我非常高兴听到这是否是在Scala中采用的完全错误的方法,我愿意接受建议)

您可以使用Manifest,但我强烈建议避免在Scala中使用这种方法。。。这绝对是错误的做法

基本上,您需要一个注册表(可以是
Map[Manifest[\u]、IHandle[\u]]]
,其中存储了所有实现和清单,然后可以在注册表中查找

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]
正确的方法可能意味着使用typeclass(试着用谷歌搜索),如果不了解您正在做什么,很难真正为您提供完整的解决方案……即使我在Scala上做了一些CQRS开发


请毫不犹豫地连接到freenode服务器上的#scala频道,与之聊天。

很酷,这正是我所做的,对于一些通用服务接口,我还为每个类型参数创建了一个显式特征。此外,对查询和命令使用严格的命名约定意味着我可以通过替换类名进行注册字符串(对于事件侦听器不太可靠,因为它们不是1-1)记住这个方法是不安全的,你应该考虑尝试创建一个类型集。
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]