为什么这些分配给 java.lang.Exception 的类型是安全的?
Why are these assignments to java.lang.Exception type safe?
为什么下面的语句不会导致编译器类型错误:
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
?
类型
Another usage for Nothing is the return type for methods which never return normally. One example is method error in scala.sys, which always throws an exception.
此处抛出的不是 return 异常,它是这些方法中的一种,通常不会 return。返回 Nothing 让编译器满意,因为 Nothing 是底层类型(其他一切的子类),并且分配子类的实例是可以的。当然,分配实际上并没有发生,因为抛出了异常。
作业永远不会完成,因为你在到达之前就扔了。所以它是完全类型安全的:
val y1: Int = throw new Exception("fail!")
y1 * 25
第 2 行不会出现类型错误,因为你永远不会到达第 2 行;在此之前,异常会脱离整个函数。所以 y1
可以是任何类型,它仍然是类型安全的。
如果您尝试分配一个异常 val y1: Int = new Exception("fail!")
,那将是一个错误,并且该值确实必须具有类型 Exception
.
为什么下面的语句不会导致编译器类型错误:
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
?
Another usage for Nothing is the return type for methods which never return normally. One example is method error in scala.sys, which always throws an exception.
此处抛出的不是 return 异常,它是这些方法中的一种,通常不会 return。返回 Nothing 让编译器满意,因为 Nothing 是底层类型(其他一切的子类),并且分配子类的实例是可以的。当然,分配实际上并没有发生,因为抛出了异常。
作业永远不会完成,因为你在到达之前就扔了。所以它是完全类型安全的:
val y1: Int = throw new Exception("fail!")
y1 * 25
第 2 行不会出现类型错误,因为你永远不会到达第 2 行;在此之前,异常会脱离整个函数。所以 y1
可以是任何类型,它仍然是类型安全的。
如果您尝试分配一个异常 val y1: Int = new Exception("fail!")
,那将是一个错误,并且该值确实必须具有类型 Exception
.