2014-04-22 22 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