2012-06-08 21 views
1

我想看看是否有讓周圍型擦除有如下情況的任何方式:Scala中,一個具體的實現參數化特徵的反射

我有一個特質

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和願意接受建議)

回答

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] 

正確的做法很可能意味着類型類的使用(嘗試谷歌爲這一點),很難真正給你一個完整的解決方案,而沒有你在做什麼的全貌...即使我在Scala上做了一些CQRS開發

不要猶豫連接到freenode服務器上的#scala頻道以進行聊天。

+0

很酷,這幾乎是我所做的,對於一些通用服務接口,我還爲每個類型參數創建了一個顯式特徵。對查詢和命令使用嚴格的命名約定意味着我可以通過類名替換字符串進行註冊。 (對於事件監聽者來說不太可靠,因爲他們不是1-1) –

+0

請記住,這種方法並不安全,您應該考慮嘗試創建一個類型類型。 –

相關問題