为什么下面的语句不会导致编译器类型错误:
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
类型的
答案 0 :(得分:3)
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
类型。