Это ошибка Scala при определении списка, такого как: - PullRequest
2 голосов
/ 14 декабря 2010

Я хочу определить список [Char] в scala, но допустил ошибку.Я пропустил один символ кавычки после 'b'.Однако я получил экземпляр List [Any].Это ошибка Scala или нормальный результат?

scala> val list = List('a',**'b**,'c','d') list: List[Any] = List(a, 'b, c, d)

Ответы [ 2 ]

5 голосов
/ 14 декабря 2010

Как уже ответил Вудс, значение 'b' является символом, тогда как 'b будет иметь тип Symbol (каноническая строка, которая также является действительным идентификатором Scala).Тип 1006 * имеет особую особенность, которая поначалу может раздражать: при добавлении в список типа A вы не ограничены добавлением экземпляров A.Но если вы добавите в список что-то еще, кроме A, в результате вы получите более общий список.Пример:

class A {}
class B extends A {}
class C extends A {}

val list1:List[B] = List(new B(), new B(), new B())
val list2:List[A] = new C() :: list1

Когда вы делаете что-то подобное, Scala находит более общий супертип (в приведенном выше примере это A) и возвращает список этого типа.Это возможно только потому, что списки типа List являются неизменными, и когда вы добавляете элемент в список, вы фактически создаете новый список и оставляете старый список без изменений.И новый список может быть более общего типа, чем исходный.

В вашем случае вы случайно наткнулись на эту функцию, потому что единственный общий супертип для Char и Symbol - Any.

5 голосов
/ 14 декабря 2010

Это не ошибка. Единственный ведущий символ означает Символ в Scala. Я просто знал это. Мне жаль. Я только начинающий Скала.

...