在 Scala 中,如果泛型方法的调用者省略了显式指定类型参数,那么糟糕的事情就会大打折扣。例如:
class Expression[+T] // Will have eval():T method, so +T
class NothingTest {
def makey[T](): Expression[T] = null
def needsBool(b: Expression[Boolean]): Unit = {}
var b: Expression[Boolean] = null
var n = makey() // : Expression[Nothing]
b=n // Yikes.
needsBool(n) // :-/ Supplied Expression[Nothing] ... not a Expression[Nothing]
}
Run Code Online (Sandbox Code Playgroud)
我应该为makey()(eg makey[Boolean]())提供一个类型参数,但是在这种情况下我忘记了程序已编译(顺便说一下,这非常容易做到)。
该程序最终将失败needsBool(省略了实现),它没有接收到一个Expression[Booolean]对象 - 它反而得到了一个Expression[Nothing]对象。Scala 的文档说 Nothing 是所有类型的子类,这看起来异常粗鲁,并且无论出现在哪里都肯定会破坏类型安全。
所以,为了重新引入一些类型安全,我可以:
makey返回 Expression[Nothing] 但要求提供类型参数?(我怀疑不是),或needsBool …