【发布时间】: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