【问题标题】:Scala ClassManifest instead of Type[T]Scala ClassManifest 而不是 Type[T]
【发布时间】:2011-06-16 07:33:58
【问题描述】:

以下代码

def httpPost[T: ClassManifest](data: AnyRef): T = {
  val webResource = client.resource("http://localhost..")
  val resp = webResource.post(classOf[ClientResponse], data)
  resp.getEntity(classManifest[T].erasure) //Need classOf[T] here 
}

导致这种类型不匹配的编译错误

[INFO]  found   : _$1 where type _$1
[INFO]  required: T
[INFO]       resp.getEntity(classManifest[T].erasure)

根据对Scala classOf for type parameter 的回答,它看起来应该可以工作。

擦除方法返回 java.lang.Class[_],我认为这是问题所在,所以我有两个问题:

  • 为什么类清单返回一个存在类型而不是简单的 Class[T] - 如果它是 T 的擦除,肯定总是 _(下划线),因为 T 显然是未知的,这意味着它的返回值不是和我预期的一样有用。
  • 我需要做什么才能使代码正常工作!

更新:

感谢 Kim 和 Jean-Phillipe 的回答。

我之前尝试过强制转换,所以原来的最后一行被替换为

val responseData = resp.getEntity(classManifest[T].erasure) //Runtime error
responseData.asInstanceOf[T]

这会编译,但现在有一个运行时错误,因为 getEntity 方法传递了 Object 类,它无法处理它,因为它需要更具体的类型(它有一个处理程序)。虽然它被推迟到运行时,但它再次归结为擦除方法没有提供特定的类型信息,这就是为什么我认为要解决问题,必须解决内联示例。

【问题讨论】:

    标签: scala


    【解决方案1】:

    此代码存在严重错误。特别是:

    def httpPost[T: ClassManifest](data: AnyRef): T = {
      val webResource = client.resource("http://localhost..")
      val resp = webResource.post(classOf[ClientResponse], data)
      resp.getEntity(classManifest[T].erasure) //Need classOf[T] here 
    }
    

    Scala 应该如何知道T 的类型是什么?调用httpPost 时是否明确传递它?我怀疑不是,这就是erasure 为您返回Object 的原因。

    至于为什么ClassManifest#erasure返回Class[_]而不是别的东西,我怀疑原因是这是大多数Java方法使用的类型,并且由于Class是不变的,如果erasure返回Class[T] ,那么您必须将其强制转换才能与这些方法一起使用!

    【讨论】:

    • 感谢您的 cmets。根据我的原始更新(关于演员表),代码没有任何问题。但是,我没有在调用站点使用类型参数 - 我认为它会从分配目标中推断出来。它适用于该添加。
    【解决方案2】:

    第一个问题:不知道...

    第二个问题:我认为在这里投射是安全的。你可以使用foo.asInstanceOf[Class[T]]

    【讨论】:

      【解决方案3】:

      我相信返回存在类型是为了清楚地表明您可能想要制作的演员是您的责任。 Class 有点奇怪:例如,Class[List[String]] 实际上应该输入为 Class[List[_]],因为它不包含有关 ListString 参数化的任何信息。当 T 本身不是参数化类型时,Kim 建议的演员表总是安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-09
        • 2013-08-08
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 2016-10-24
        • 2011-06-18
        • 2015-12-03
        相关资源
        最近更新 更多