Вопрос

Разве ничего не подтип всех типов?

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

Странно, что это не работает.

Это указано, функция или ошибка?

Это было полезно?

Решение

Когда вы видите странное поведение, не связанное с тем, что алгоритм вывода типа считает, что оно не вставило самого самого самого, поскольку он вводится во время вывода типа: если ничего не известно о переменной типа, то она ограничена любым и ничем. Это давно было в моем списке вещей, чтобы увидеть, смогу ли я представить новый нижний тип только для внутреннего, поэтому на уровне пользователя ничего не было ничто, и ничто не смешано, но это довольно амбициозная задача. Тем не менее, теперь я мог бы быть достаточно жестким, чтобы попробовать это.

Другие советы

Я подозреваю, что Скала не должна позволять вам делать такого рода Array[Nothing] экземпляр. По определению нет случаев ничего, но ваш массив выглядит так, как будто он наполнен NothingS, которые являются нулевыми, но NULL не является допустимым значением для Nothing. Анкет Это, например, не удается с ошибкой type mismatch; found : Null(null) required: Nothing

val n: Nothing = null

Поэтому я ожидаю, что вы столкнетесь с проблемами каждый раз, когда вы можете обмануть систему, чтобы поверить, что вы, наконец, завладеете, например, востребованные Nothing

Вот еще один странный случай. Запустите это:

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

}

Обратите внимание, что тип массива Scala инвариант. Так Nothing Быть подтипом всего может не быть актуальным.

Также map а также filter не определены на Array. Анкет Неявные преобразования в Predef используются для предоставления таких методов для массивов.

Таким образом, компилятор не может найти неявное преобразование из Array[Nothing] к чему -то, что имеет map или же filter определенный. Используя реплику, я действительно вижу, что такое неявное преобразование должно быть доступно:

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 обращение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top