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 2.7.2开始,有一些叫做ManifestJava类型擦除的解决方法.但是,如何Manifest确切地工作以及为什么/何时需要使用它?
Jorge Ortiz 的博客文章Manifests:Reified Types解释了其中的一些内容,但它没有解释如何将它与上下文界限一起使用.
那么ClassManifest,有什么区别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似乎有很多变化,我我不确定那些仍然准确.
我正在做一些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)
我以为自己很聪明,但显然我不是.;) 我究竟做错了什么?
这个错误是什么意思?
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)
我没有线索......