2014-04-22 45 views
0

我目前正在寫一個通用的函數來執行調度異步請求訪問通用函數的類型,但我不能在調度處理器訪問泛型類型:不能在內部PartialFunction

private def execQuery[MessageType](query : Req, errorMsg : String) 
{ 
    Http(query OK as.String).either 
     .onSuccess 
    { 
     case Left(error) => println(errorMsg) 
     case Right(json) => println(new MessageType(json)) // error here 
    } 
} 

我有一個錯誤新消息類型:「新消息類型(json)」中的「無法解析符號消息類型」。 你能幫我嗎?

預先感謝您

維克多

編輯:我發現這裏http://www.brentsowers.com/2011/11/writing-generic-functions-that-take.html的其他有趣的方式。你必須使用清單功能:

class DynamicTestClass() { 
    def output() { 
     println("Hello from a dynamically sent class") 
    } 
} 

def testFunc[T : Manifest]() : T = { 
    manifest[T].erasure.newInstance().asInstanceOf[T] 
} 
val dynamicTestClassInstance = testFunc[DynamicTestClass]() 
dynamicTestClassInstance.output() 

它似乎工作!

回答

1

在Scala中你不能做

def mustMakeA[A](b:String):A = new A(b) 

一些實際的原因。 scalac應該知道A是否具有公共構造函數及其參數?

但是你可以用一個更聰明的設計,例如,一個類型的類「知道」如何構建參數:

class Message(val value:String) 

trait Constructor[A] { 
    def cons(b:String) 
} 

implicit class MessageHasConstructor(m:Message) extends Constructor[Message] { 
    def cons(b:String) = new Message(b) 
} 

的Et瞧,現在我們重寫我們mustMakeA爲:

def mustMakeA[A:Constructor](b:String):A = implicitly[Constructor[A]].cons(b) 

mustMakeA[Message]("Example") // would give us a `new Message("Example")` 

順便說一句,我沒有測試代碼,所以它可能需要一些調整。

+0

帶口音的法語,+1。 '含蓄地[Cons [A]]',對吧? –

+0

謝謝,但您的示例需要添加膨脹代碼:/請參閱我的編輯,Manifest功能似乎是處理此問題的正確方法。 – mecanix

+0

膨脹的代碼?在那種情況下,我需要你定義'正確'。 – pedrofurla