Почему Map и Set имеют псевдонимы в scala.Predef? - PullRequest
7 голосов
/ 15 ноября 2010

9 раз из 10, просто используя Map и Set, ведите себя так, как я ожидал, но иногда я неожиданно сталкиваюсь с

error: type mismatch; 
[INFO]  found   : scala.collection.Set[String]
[INFO]  required: Set[String]

Например, из REPL:

scala> case class Calculator[+T](name: String, parameters: Set[String])
defined class Calculator

scala> val binding=Map.empty[String, String]
binding: scala.collection.immutable.Map[String,String] = Map()

scala> Calculator("Hello",binding.keySet)
<console>:9: error: type mismatch;
found   : scala.collection.Set[String]
required: Set[String]
       Calculator("Hello",binding.keySet)
                                  ^

Мне кажется, я понимаю ошибку, то есть вызов функции для псевдонимов возвращает действительные типы.

И поэтому мне кажется, что решение состоит в том, чтобы импортировать несвязанные типы.После чего каждый другой файл в моем проекте теперь будет генерировать ошибки несоответствия типов, поэтому мне придется импортировать его в каждый файл.Что приводит к вопросу, который я задаю в заголовке: какова была цель псевдонима в Predef, если в конечном итоге мне все равно нужно импортировать реальный пакет?типичный или оба?

Ответы [ 2 ]

12 голосов
/ 15 ноября 2010

Вы ошиблись в диагностике проблемы.Дело не в том, что он не распознает псевдоним типа того же типа, что и псевдоним.Дело в том, что псевдоним типа - это scala.collection.immutable.Set, и это не то же самое, что scala.collection.Set.

Редактировать: кстати, я думал, что исправил это, о чем свидетельствуеткомментарий в типе диагностики:

   ... Also, if the
*  type error is because of a conflict between two identically named
*  classes and one is in package scala, fully qualify the name so one
*  need not deduce why "java.util.Iterator" and "Iterator" don't match.

Видимо, нужно больше работы.

Редактировать 17.07.2010: ОК, это заняло у меня шокирующе много времени, но теперь, по крайней мере, что-то говориттрудно понять неправильно.

files/neg/type-diagnostics.scala:4: error: type mismatch;
 found   : scala.collection.Set[String]
 required: scala.collection.immutable.Set[String]
  def f = Calculator("Hello",binding.keySet)
                                     ^
2 голосов
/ 15 ноября 2010

Реальная проблема заключается в том, что scala.collection.immutable.Map#keySet возвращает scala.collection.Set (только для чтения Set) вместо scala.collection.immutable.Set (неизменный Set).Я оставлю это кому-то другому, чтобы объяснить, почему это ...

Редактировать

Кто-то просит объяснить тип возврата Map#keySet in эта тема , но не получает ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...