这是一个Scala的错误,在定义如下列表时:

woo*_*ods 2 scala scala-2.8

我想在scala中定义一个列表[Char],但是犯了一个错误.我错过了'b'之后的单引号字符.但是我得到了一个List [Any]实例.这是Scala的错误还是正常的结果?

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

woo*_*ods 5

这不是一个错误.单个字符前导表示Scala中的符号.我才知道.对不起.我只是Scala的初学者.


Mad*_*doc 5

正如森林已经回答的那样,值'b'是一个字符,而是'b类型Symbol(一个规范的字符串,也是一个有效的Scala标识符).

List类型具有一个非常特殊的功能,可能首先令人恼火:添加到类型列表时A,您不限于添加实例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
Run Code Online (Sandbox Code Playgroud)

当您执行此类操作时,Scala会找到更一般的超类型(在上面的示例中,这是A),并返回该类型的列表.这是唯一可能的,因为类型列表List是不可变的,当您向列表中添加元素时,实际上您创建了一个新列表并保持旧列表不变.新列表可以是比原始列表更通用的类型.

在你的情况,你不小心绊了这个功能,因为只有共同的超类型CharSymbolAny.