我目前正在编写一个通用函数来执行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()
似乎有效!
答案 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")`
是的,我没有测试代码,所以可能需要一些调整。