3

すべてのタイプのサブタイプはありませんか?

scala> val array = new Array(5)
array: Array[Nothing] = Array(null, null, null, null, null)

scala> array.map(_ => 42)
<console>:9: error: value map is not a member of Array[Nothing]
       array.map(_ => 42)
             ^

scala> array.filter(_ != 42)
<console>:9: error: value filter is not a member of Array[Nothing]
       array.filter(_ != 42)
             ^

これが機能しないのは奇妙です。

これは指定されていますか、機能ですか、それともバグですか?

4

3 に答える 3

7

Nothingに関連する奇妙な動作が見られる場合、それは型推論アルゴリズムがNothing自体を挿入したと見なすためです。これは、型推論中に導入されるためです。型変数について何も知られていない場合は、AnyandNothingによって制限されます。その目的のために新しい内部専用ボトムタイプを導入できるかどうかを確認することは長い間私のリストにありました。ユーザーレベルのNothingと推論レベルのNothingが混ざり合うことはありませんが、それはかなり野心的な作業です。それでも、私は今それを試すのに十分ハードコアかもしれません。

于 2011-05-01T18:28:00.693 に答える
4

ScalaはあなたにそのようなArray[Nothing]インスタンス化をさせてはいけないと思います。定義上、周りに何もないインスタンスはありませんが、配列はnullであるsで満たされているように見えますNothingが、nullはの有効な値ではありませんNothing。これは、たとえば、エラーで失敗しますtype mismatch; found : Null(null) required: Nothing

val n: Nothing = null

Nothingですから、実際にシステムをだまして、たとえば…</ p> のように、最終的に非常に求められているものを手に入れていると信じることができるたびに、問題が発生することを期待しています。

別の奇妙なケースがあります。これを実行します:

object Main {

  class Parametrized[T] { var value: T = _ }

  def main(args: Array[String]) {
    val p = new Parametrized // typed as Parametrized[Nothing]
    val n = p.value  // n is now actually an instance of Nothing... isn't it?
    println(p.value) // prints null, but null is not an instance of Nothing
    println(n)       // throws NullPointerException...
  }

}
于 2011-04-30T16:39:05.567 に答える
4

Scala配列型は不変であることに注意してください。したがってNothing、すべてのサブタイプであることは関係がない場合があります。

またmap、とfilterはで定義されていませんArray。の暗黙的な変換はPredef、配列にそのようなメソッドを提供するために使用されます。

そのため、コンパイラは、またはが定義されArray[Nothing]ているものへの暗黙の変換を見つけることができません。REPLを使用すると、このような暗黙の変換が利用可能であることが実際にわかります。mapfilter

scala> val conv = implicitly[Array[Nothing] <%< collection.mutable.ArrayOps[Nothing]]

conv: <%<[Array[Nothing],scala.collection.mutable.ArrayOps[Nothing]] = <function1>

scala> conv(new Array[Nothing](5)).filter(_ => true)
res8: Array[Nothing] = Array(null, null, null, null, null)

genericArrayOpsしたがって、問題は、コンパイラが変換を考慮しない理由になります。

于 2011-04-30T17:27:40.107 に答える