Question

n'est pas rien un sous-type de tous les types?

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)
             ^

Il est bizarre que cela ne fonctionne pas.

Est-ce spécifié, une fonction ou un bug?

Était-ce utile?

La solution

Quand vous voyez le comportement bizarre impliquant rien, il est parce que l'algorithme d'inférence de type pense qu'il inséré rien lui-même, puisqu'il est introduit au cours de l'inférence de type: si on ne sait rien sur une variable de type il est limité par Tout et rien. Il a longtemps été sur ma liste de choses à faire pour voir si je peux présenter un nouveau type interne uniquement en bas à cette fin pour rien au niveau utilisateur et rien niveau d'inférence ne sont pas entremêlés, mais il est une tâche assez ambitieuse. Pourtant, je pourrais maintenant être assez hardcore essayer.

Autres conseils

Je soupçonne Scala ne devrait pas vous laisser faire ce genre de Array[Nothing] instanciation. Il n'y a par définition aucun cas de rien autour, mais votre tableau ressemble il est rempli de Nothings qui sont nuls, mais nul n'est pas une valeur valide pour Nothing. Ce par exemple échoue avec le type mismatch; found : Null(null) required: Nothing d'erreur

val n: Nothing = null

Je vous attendriez à des ennuis chaque fois que vous pouvez réellement tromper le système de croire que vous enfin mettre la main sur une très recherché, par exemple, de Nothing ...

Voici un autre cas bizarre. Exécutez ceci:

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...
  }

}

Notez que le type de tableau Scala est invariant. Donc Nothing étant un sous-type de tout ne peut pas être pertinent.

En outre map et filter ne sont pas définis sur Array. Les conversions implicites dans Predef sont utilisés pour fournir de telles méthodes pour les tableaux.

Ainsi, le compilateur ne peut pas trouver une conversion implicite de Array[Nothing] à quelque chose qui a défini le map ou filter. Utilisation de la REMP, je peux voir en fait qu'une telle conversion implicite devrait être disponible:

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)

La question est donc pourquoi le compilateur ne considère pas le genericArrayOps conversion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top