相关疑难解决方法(0)

可以让 scala 需要一个非 Nothing 的泛型方法参数并返回类型安全

在 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 …

generics scala

2
推荐指数
1
解决办法
1077
查看次数

标签 统计

generics ×1

scala ×1