当前位置: 首页 > 知识库问答 >
问题:

如何解封用作方法返回值的泛型类型?

牛骞仕
2023-03-14


我是scala的新手,如果您能帮助我解决以下问题,我将不胜感激。
我正在使用akka-http发送http请求我想声明一个泛型发送请求方法,它将使用Unmarshall的http响应主体转换为泛型类型。
我应该如何将Unmarshal响应强制转换为T???

发送请求实现:


    def sendRequest[T](requestMessage :HttpRequestMessage) :Future[T] =
    {

        val promise = Promise[HttpResponse]() 
        val request = requestMessage.request -> promise

        queue.offer(request).flatMap {
          case QueueOfferResult.Enqueued => promise.future.flatMap[AnyRef] { 
            response => { 
                response.entity.toStrict(FiniteDuration(3,"seconds")).flatMap {
                  strict =>  Unmarshal(strict.getData).to[T]
                }
              }
          }
        }

    }

共有1个答案

仉昱
2023-03-14

如果查看Unmarshal对象的代码,可以看到to中使用的类型参数有一定的约束--一个隐式的Unmarshaller:

class Unmarshal[A](val value: A) {
  /**
   * Unmarshals the value to the given Type using the in-scope Unmarshaller.
   */
  def to[B](implicit um: Unmarshaller[A, B], ec: ExecutionContext, mat: Materializer): Future[B] = um(value)
}

将类型a的值反编组为类型B的值时,作用域中必须有unmarshaller[a,B]类型的隐式值可用。有许多预定义的解封程序(例如,这里有一些用于将字符串转换为各种类型(如Int、Boolean等)的常用解封程序,但您也可以定义自己的解封程序。这称为类型类模式。

因此,如果希望代码适用于某种类型t,则必须确保在作用域中有该类型的隐式解封程序可用。这意味着您的方法sendrequest必须有一个类型为unmarshaller[Data,T]的隐式参数,其中Data应该替换为strict,getdata的任何实际类型(我无法从您的代码中分辨出来)。

下面是这样的:

def sendRequest[T](requestMessage: HttpRequestMessage)(implicit m: Unmarshaller[Data, T]): Future[T] // replace Data with concrete type

这允许将编译为[T],但现在您有义务在调用到[T]时在作用域中实际具有此隐式值。如前所述,您有两个选项--或者导入预定义的解封程序(如前面显示的PredefinedFromStringUnmarshallers),或者定义您自己的解封程序。我不知道t可以是什么,所以我不能给您更多的建议,但主要的一点是,只要您为t后面的具体类型提供解组器(通过导入或手动定义),它就应该可以工作;否则akka将不知道如何解马修到你的T。

 类似资料:
  • 我得到了ClassCastException。我正在遵循这个答案,但没有得到正确的答案。将对象转换为通用类型以返回 BubbleSort.java MainPorgram.java 安慰 线程“main”Java . lang . classcastexception中出现异常:无法转换[ljava . lang . object;to [I at java.lang.Class.cast(未知来

  • 问题内容: 我尝试用泛型创建一个抽象类。业务逻辑是将文本从一种语言翻译成另一种语言。每种语言都必须有一个课程。对于每种语言,我还需要一个类,该类是方法的返回对象,它具有参数。T应该是(例如EnglishText,ChineseText等)的子类。那就是我奋斗的地方。您如何编码此约束? 我创建了以下超级类。 如果我误解了泛型的概念或将其错误地使用,请说明一下。谢谢。 问题答案: 只需将其添加到定义泛

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 类具有类似类型的方法(让我们称其为收集器)。我认为这些方法可以通过使其返回一个包装泛型值的类来实现。 这是示例代码 此代码产生错误 我知道我可以通过使用泛型值创建收集器类来解决这个问题。我希望Collector类是单例的,我是指bean。所以我不能这么做。 有办法吗?

  • 现在我希望以泛型的方式使用这些类。 如何从方法“method1”和“method2”返回泛型类型(可以是猫或狗)。我有几个返回“T extends Animal”的方法,所以最好在方法级别或类级别中声明泛型类型。

  • Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?