2012-12-03 46 views
1

這個問題是有關第一個: Iteration over a sealed trait in Scala?枚舉 - >具有「值」的密封特徵?

我有以下特點密封

/** 
* @author Sebastien Lorber (<i>[email protected]</i>) 
* Date: 02/12/12 - Time: 17:49 
*/ 
sealed trait ResizedImageKey { 

    /** 
    * Get the dimensions to use on the resized image associated with this key 
    */ 
    def getDimension(originalDimension: Dimension): Dimension 

} 

object ResizedImageKey { 
    val ALL_KEYS: List[ResizedImageKey] = List(Large,Medium,Small,X2) 
} 

case class Dimension(width: Int, height: Int) 

case object Large extends ResizedImageKey { 
    def getDimension(originalDimension: Dimension) = Dimension(1000,1000) 
} 

case object Medium extends ResizedImageKey{ 
    def getDimension(originalDimension: Dimension) = Dimension(500,500) 
} 

case object Small extends ResizedImageKey{ 
    def getDimension(originalDimension: Dimension) = Dimension(100,100) 
} 

case object X2 extends ResizedImageKey{ 
    def getDimension(originalDimension: Dimension) = Dimension(
    width = originalDimension.width * 2, 
    height = originalDimension.height * 2 
) 
} 

這現在工作得很好。 問題是我需要能夠使用我的ResizedImageKey作爲將存儲在MongoDB和Salat中的地圖的關鍵字。

我不認爲薩拉特支持「密封特質轉換」對嗎? 所以我應該移動到枚舉,這迫使我做尺寸計算匹配/情況?或者有什麼已知的解決方案來解決這個問題? 是否有可能創建枚舉值對象而不擴展枚舉或什麼?

謝謝

+0

你確實得到了一個「匹配並不詳盡......」的警告,因爲這個特徵是密封的。 – yakshaver

回答

2

薩拉特開發人員在這裏。

Salat支持使用@Salat註釋的案例對象層次結構。 (我從來沒有推薦在Scala中使用枚舉 - 它們是可怕的)。

現在...使用case對象作爲map的鍵實際上不是mongo支持的東西。 mongo中的所有映射密鑰都必須是字符串。

那麼你試圖堅持這張地圖是什麼樣子?

+0

謝謝。它看起來像[ImageResizeKey,FileDescriptor],我寧願保持它,如果可能的話比[String,FileDescriptor]。 –

+0

不幸的是,由於MongoDB不支持使用對象作爲地圖的關鍵,你可以做的是堅持一個case類的列表,並將它轉換爲一個map作爲你的case類中的lazy val。要求鍵映射爲字符串是MongoDB的明確限制。 – prasinous