2012-01-30 66 views
3

我在Scala中編寫了一些代碼,它依賴於我無法在參數上看到的類型參數。是否可以匹配Scala中的清單類型?

def read[T](json: String)(implicit m: Manifest[T]): T = { 
    if (m <:< manifest[Map[String, Any]]) { 
    JsonParser.jsonToMap(json).asInstanceOf[T] 
    } else { 
    throw new UnsupportedOperationException("Not implemented for type %s".format(m)) 
    } 
} 

除了事實,我寫我自己的JSON的框架,這可能是一個非常糟糕的主意......

我可以用它代替的if語句case語句,或者我應該在不同的方向思考?

回答

6

在類似這些情況下,您更喜歡使用針對清單或類的測試序列(或更常用的類型套接字),這種情況下更好的想法是使用類型類。在這種特殊情況下,它看起來像,

// Type class 
trait JsonReader[T] { 
    def apply(json : String) : T 
} 

// Type class instance for type Map[String, Any] 
implicit def mapReader = new JSonReader[Map[String, Any]] { 
    def apply(json : String) = 
    JsonParser.jsonToMap(json).asInstanceOf[Map[String, Any]] 
} 

def read[T](json : String)(implicit reader : JsonReader[T]) : T = reader(json) 

您應該爲所有您關心的類型添加類型實例。

您現在可以叫你讀功能如下,

read[Map[String, Any]](... some json ...) 

需要注意的是,現在,如果你試圖用對應於您已不提供類型的類實例的一個類型的類型參數來調用它結果在編譯時將是錯誤的,而不是在運行時的UnsupportedOperationException

+0

很好的答案,謝謝! – iwein 2012-02-10 06:19:50