首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在两个scala运行环境中有不同的结果?

为什么在两个scala运行环境中有不同的结果?
EN

Stack Overflow用户
提问于 2014-04-24 12:40:17
回答 1查看 98关注 0票数 2

我正在阅读“scala 2中的编程”一书的第19.3节,第431页中有一段代码片段和一些描述:

注: FC17 x86_64 Scala-2.9.2

代码语言:javascript
复制
 class Cell[T](init: T) {
 private[this] var current = init
 def get = current
 def set(x: T) { current = x }
 }

我在两个不同的环境中修改了这个示例:在第一个环境中,我在一个文件Cell.scala中编写了以下代码

代码语言:javascript
复制
class A
class B extends A
class C extends B
class Cell[+T](init: T) {
private[this] var current = init
    def get = current
    def set[U >: T](x: U) {
    current = x.asInstanceOf[T]
    println("current " + current)
}
}

object Cell {
 def main(args: Array[String]) {
 val a1 = new Cell[B](new B)
 a1.set(new B)
 a1.set(new String("Dillon"))
 a1.get
}
}

并使用以下命令,并且没有出错:

代码语言:javascript
复制
[abelard <at> localhost lower-bound]$ scalac Cell.scala
[abelard <at> localhost lower-bound]$ scala -cp . Cell
current B <at> 67591ba4
current Dillon
Dillon
[abelard <at> localhost lower-bound]$ 

在第二部分中,我直接在REPL下编写了代码:

代码语言:javascript
复制
 scala> class Cell[+T](init: T) {
 | private[this] var current = init
 | def get = current
 | def set[U >: T](x: U) {current = x.asInstanceOf[T]
 | }}
defined class Cell

scala> val a1 = new Cell[B](new B)
a1: Cell[B] = Cell <at> 6717f3cb
scala> a1.set(new B)
scala> a1.set(new String("Dillon"))
scala> a1.get

java.lang.ClassCastException: 
java.lang.String cannot be cast to B
at .<init>(<console>:25)
at .<clinit>(<console>)

根据我对协变和下界的看法,我认为第二个结果是正确的,但我不知道为什么第一个没有抛出任何错误?

我知道我一定遗漏了什么,我想得到一个编译错误作为第二个,我应该做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-24 15:33:56

您不会得到编译错误,因为在编译时没有问题。ClassCastException是运行时异常。

您应该注意到,异常发生在您计算a1.get之后,而不是当您在a1.set中执行强制转换时。更准确地说,当您试图将返回值赋值给变量时,就会发生这种情况。

在第一个场景中,a1.get不被分配给一个值。在第二个阶段,您将它赋值给一个值,如res0等。

您可以通过在REPL中尝试以下操作来证明这是问题所在:

代码语言:javascript
复制
scala> a1.get
java.lang.ClassCastException: java.lang.String cannot be cast to B

scala> println(a1.get)
Dillon
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23269173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档