【问题标题】:Can't access generic function type in a inner PartialFunction无法访问内部 PartialFunction 中的泛型函数类型
【发布时间】:2014-04-22 09:22:59
【问题描述】:

我目前正在编写一个通用函数来执行 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()

它似乎工作!

【问题讨论】:

    标签: scala generics asynchronous dispatch


    【解决方案1】:

    你做不到

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

    等等,现在我们将mustMakeA 重写为:

    def mustMakeA[A:Constructor](b:String):A = implicitly[Constructor[A]].cons(b)
    
    mustMakeA[Message]("Example") // would give us a `new Message("Example")`
    

    顺便说一句,我没有测试代码,所以它可能需要一些调整。

    【讨论】:

    • 法语带口音,+1。 implicitly[Cons[A]],对吧?
    • 谢谢,但您的示例需要添加膨胀代码:/ 请参阅我的编辑,Manifest 功能似乎是处理此问题的正确方法。
    • 代码膨胀?在那种情况下,我需要你定义“正确”。
    • @som-snytt, oui, français seulement avec des 口音! :) 顺便说一句,操作,你是对的。
    • 代码膨胀?在那种情况下,我需要你定义“正确”。如果您稍微锻炼一下您的创造力,或者如果是这样,实际学习 Scala,您会发现“Manifest”充其量是解决您问题的拼凑解决方案。类型类不仅针对一种情况给出了解决方案,示例还可以扩展到构造函数的所有情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2020-06-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多