无法访问内部PartialFunction中的泛型函数类型

时间:2014-04-22 09:23:00

标签: scala generics asynchronous dispatch

我目前正在编写一个通用函数来执行Dispatch异步请求,但我无法在Dispatch处理程序中访问泛型类型:

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
    }
}

我在新的MessageType上遇到错误:“无法解析”新MessageType(json)中的符号MessageType“。 你能救我吗?

提前谢谢

维克多

编辑:我在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 个答案:

答案 0 :(得分:1)

你做不到

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

一些实际原因。如果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)
}

Etvoilà,现在我们将mustMakeA重写为:

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

mustMakeA[Message]("Example") // would give us a `new Message("Example")`
是的,我没有测试代码,所以可能需要一些调整。