我想在scala中定义一个列表[Char],但是犯了一个错误。我错过了'b'之后的单引号字符。但是我得到了一个List [Any]实例。这是Scala的错误还是正常结果?
scala> val list = List('a',**'b**,'c','d')
list: List[Any] = List(a, 'b, c, d)
答案 0 :(得分:5)
这不是一个错误。单个字符前导表示Scala中的符号。我才知道。 对不起。我只是Scala的初学者。
答案 1 :(得分: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
。