相关疑难解决方法(0)

如何在Scala上绕过类型擦除?或者,为什么我不能获得我的集合的类型参数?

Scala生活中的一个可悲事实是,如果你实例化一个List [Int],你可以验证你的实例是一个List,你可以验证它的任何单个元素是一个Int,但不是它是一个List [ Int],可以很容易地验证:

scala> List(1,2,3) match {
     | case l : List[String] => println("A list of strings?!")
     | case _ => println("Ok")
     | }
warning: there were unchecked warnings; re-run with -unchecked for details
A list of strings?!
Run Code Online (Sandbox Code Playgroud)

-unchecked选项将责任直接归咎于类型擦除:

scala>  List(1,2,3) match {
     |  case l : List[String] => println("A list of strings?!")
     |  case _ => println("Ok")
     |  }
<console>:6: warning: non variable type-argument String in type pattern is unchecked since it is eliminated by erasure
        case l …
Run Code Online (Sandbox Code Playgroud)

scala type-erasure

366
推荐指数
7
解决办法
7万
查看次数

什么是Scala中的清单,什么时候需要它?

从Scala 2.7.2开始,有一些叫做ManifestJava类型擦除的解决方法.但是,如何Manifest确切地工作以及为什么/何时需要使用它?

Jorge Ortiz 的博客文章Manifests:Reified Types解释了其中的一些内容,但它没有解释如何将它与上下文界限一起使用.

那么ClassManifest,有什么区别Manifest

我有一些代码(一个更大的程序的一部分,不能轻易地包含在这里),它有关于类型擦除的一些警告; 我怀疑我可以通过使用清单解决这些问题,但我不确定如何解决.

scala manifest

130
推荐指数
3
解决办法
3万
查看次数

Scala(2.8)Manifest如何工作?

我有一些Scala代码可以大量使用泛型,我从文档中收集到,在参数化约束中使用清单可以帮助我解决类型擦除问题(例如,我想实例化泛型类型的新对象) ).只是,我想更多地了解这是如何工作的.它几乎感觉像某种哈希映射为每个调用站点获取一个条目......这里有人可以详细说明吗?

class Image[T <: Pixel[T] : Manifest](fun() => T, size: Array[Int], data: Array[T]) {
    def this(fun: () => T, size: Array[T]) {
        this(fun, size, new Array[T](size(0) * size(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

这在我在网站上找到的任何文档中似乎都没有涉及,而在Google上我主要使用语法差别很大的旧文章,因为2.8似乎有很多变化,我我不确定那些仍然准确.

generics scala manifest

23
推荐指数
1
解决办法
9473
查看次数

如何使用Scala的Manifest类在运行时实例化已擦除的类?

我正在做一些WebDriver + PageObject的东西.

(如果您不熟悉PageObjects,这是一种模式,您有一个类代表您网站上的每个页面,它使用域语言公开页面的所有功能,从测试中隐藏HTML内容.)

我想要变得懒惰,并且在我的抽象Page类中有一个'submit'方法,我的所有其他Pages都扩展了.我也希望这个方法能够新建下一个Page子类并返回它.

这是我在Page类中的内容:

def submitExpecting[P <: Page[P]](implicit m: Manifest[_]): P = {
  driver.findElement(By.xpath("//input[@type='submit']")).click
  m.erasure.getConstructor(classOf[WebDriver]).newInstance(driver).asInstanceOf[P]
}
Run Code Online (Sandbox Code Playgroud)

这就是我如何称呼它:

val userHomePage = userSignupPage
      .login("graham")
      .acceptTermsAndConditions
      .submitExpecting[UserHomePage]
Run Code Online (Sandbox Code Playgroud)

编译这个,我得到:

error: could not find implicit value for parameter m: Manifest[_]
.submitExpecting[UserHomePage]
Run Code Online (Sandbox Code Playgroud)

我以为自己很聪明,但显然我不是.;) 我究竟做错了什么?

generics reflection scala instantiation manifest

3
推荐指数
1
解决办法
1267
查看次数

清单与ClassManifest.这个Scala错误是什么意思?

这个错误是什么意思?

scala> val a = Array[{ def x: Int }](new { def x = 3 }) 
<console>:5: error: type mismatch;
 found   : scala.reflect.Manifest[java.lang.Object]
 required: scala.reflect.ClassManifest[AnyRef{def x: Int}]
       val a = Array[{ def x: Int }](new { def x = 3 })
                                    ^
Run Code Online (Sandbox Code Playgroud)

我没有线索......

scala manifest scala-2.8

3
推荐指数
1
解决办法
773
查看次数