Scala类清单而不是类型[T]
下面的代码Scala类清单而不是类型[T],scala,Scala,下面的代码 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 } 导致此
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)
根据对它的回答,它看起来应该有效
erasure方法返回java.lang.Class[\ux],我认为这就是问题所在,因此我有两个问题:
- 为什么类清单返回一个存在类型而不是简单的类[T]——如果它是对T的擦除,那么肯定会一直是uz(下划线),因为T显然是未知的,这意味着它的返回值没有我预期的那么有用
- 我需要做什么才能使代码正常工作李>
val responseData = resp.getEntity(classManifest[T].erasure) //Runtime error
responseData.asInstanceOf[T]
这会编译,但现在有一个运行时错误,因为getEntity方法被传递给Object类,它无法处理该类,因为它需要一个更具体的类型(它有一个处理程序)。虽然它被推迟到运行时,但这又归结为擦除方法没有给出特定的类型信息,这就是为什么我认为要解决这个问题,必须解决内联示例。第一个问题:不知道
第二个问题:我认为在这里投球是安全的。您可以使用
foo.asInstanceOf[Class[T]]
我相信返回一个存在类型是为了明确您可能要进行的转换是您的责任Class
有点奇怪:例如,Class[List[String]]
实际上应该作为Class[List[\u]]
键入,因为它不包含任何有关字符串的参数化的信息。当T
本身不是参数化类型时,Kim建议的演员阵容总是安全的。此代码有严重错误。特别是:
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
时是否显式传递它?我怀疑不是,这就是擦除
为您返回对象
的原因
至于为什么ClassManifest#erasure
返回Class[\u]
而不是其他东西,我怀疑原因是大多数Java方法都使用这种类型,而且由于Class
是不变的,如果erasure
返回Class[T]
,那么您必须将其强制转换为与这些方法一起使用 谢谢你的评论。根据我最初的更新(关于演员阵容),代码没有问题。但是,我没有在调用站点使用类型参数——我认为它可以从赋值目标推断出来。它与这一补充起作用。