为什么有些Scala方法使用多态参数而不是使用Any/Nothing?

Pet*_*lák 7 polymorphism scala nothing any

例如,Exception.allCatch定义为

def allCatch[T]: Catch[T] 
Run Code Online (Sandbox Code Playgroud)

为什么不呢

val allCatch: Catch[Nothing]
Run Code Online (Sandbox Code Playgroud)

什么时候Catch它的论证是协变的?

或者,为什么PartialFunction对象定义

def empty[A, B]: PartialFunction[A, B] 
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

val empty: PartialFunction[Any,Nothing]
Run Code Online (Sandbox Code Playgroud)

更新:到目前为止似乎答案错过了重点.因此,请在答案中包含一个真正针对问题的具体示例.例如:显示一段可以使用def empty[A, B]: PartialFunction[A, B]但不起作用(或不太方便)的代码val empty: PartialFunction[Any,Nothing].

小智 2

这节省了稍后进行转换的需要,并允许将 args 类型视为 T 而不是 Any,这通常更方便。

这是一个例子:

scala> def func1[T](arg : T) : T = { arg }
func1: [T](arg : T)T

scala> def func2(arg : Any) : Any = { arg }
func2: (arg: Any)Any

scala> func1(4)
res4: Int = 4

scala> func2(4)
res7: Any = 4
Run Code Online (Sandbox Code Playgroud)