Почему карта/фильтр ... не работает с массивом ничего?
-
27-10-2019 - |
Вопрос
Разве ничего не подтип всех типов?
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]
экземпляр. По определению нет случаев ничего, но ваш массив выглядит так, как будто он наполнен Nothing
S, которые являются нулевыми, но 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
обращение.