为什么这些java.lang.Exception类型的赋值安全?

时间:2015-01-14 20:53:30

标签: scala

为什么下面的语句不会导致编译器类型错误:

val y1: Int = throw new Exception("fail!")
val y2: Boolean = throw new Exception("fail!")
val y3: String = throw new Exception("fail!")
val y4: List[Any] = throw new Exception("fail!")
val y5 : java.lang.Exception = throw new Exception("fail!")

只有y5类型属于java.lang.Exception类型,所以期望它是类型安全的,但为什么y1,y2,y3,y4也类型安全?它们都应该是java.lang.exception类型的

2 个答案:

答案 0 :(得分:3)

API doc for Nothing说:

  

Nothing的另一种用法是永远不会正常返回的方法的返回类型。一个例子是scala.sys中的方法错误,它总是抛出异常。

这里throw不返回Exception,它是其中一个永远不会正常返回的方法。返回Nothing使编译器保持高兴,因为Nothing是底层类型(其他所有的子类),并且分配子类的实例是可以的。当然,从未实际发生过赋值,因为异常会被抛出。

答案 1 :(得分:1)

任务永远不会完成,因为你在到达之前就扔了。所以它完全是类型安全的:

val y1: Int = throw new Exception("fail!")
y1 * 25

第2行不会出现类型错误,因为你从未进入第2行;在此之前,异常会突破整个函数。所以y1可以是任何类型,它仍然是类型安全的。

如果您尝试分配异常val y1: Int = new Exception("fail!"),那将是一个错误,并且该值确实必须包含Exception类型。