Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala类清单而不是类型[T]_Scala - Fatal编程技术网

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显然是未知的,这意味着它的返回值没有我预期的那么有用
  • 我需要做什么才能使代码正常工作
更新:

谢谢Kim和Jean Phillipe的回答

我之前试过一个演员阵容,所以原来的最后一行被替换为

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]
,那么您必须将其强制转换为与这些方法一起使用

谢谢你的评论。根据我最初的更新(关于演员阵容),代码没有问题。但是,我没有在调用站点使用类型参数——我认为它可以从赋值目标推断出来。它与这一补充起作用。