2010-12-14 1 views
2

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

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

ответ

5

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

5

В лесу уже ответили, значение 'b' является характер, в то время как 'b будет иметь тип Symbol (канонической строки, которая также является допустимым идентификатором Scala).

Тип List имеет очень особенную функцию, которая может вызвать раздражение вначале: при добавлении к списку типа 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.

Смежные вопросы