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

マニフェストを使用することはできますが、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]

正しいアプローチはおそらくtypeclassの使用を意味します(そのためにグーグルしてみてください)、あなたがしていることの全体像を持たずに完全な解決策を本当に与えるのは難しいです...私があまりにもいくつかのCQRS開発をしているとしてもScalaで。

freenodeサーバーの#scalaチャンネルに接続して、それについてチャットすることを躊躇しないでください。

于 2012-06-09T20:51:53.960 に答える