我想在scala中定义一个列表[Char],但是犯了一个错误.我错过了'b'之后的单引号字符.但是我得到了一个List [Any]实例.这是Scala的错误还是正常的结果?
scala> val list = List('a',**'b**,'c','d')
list: List[Any] = List(a, 'b, c, d)
正如森林已经回答的那样,值'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是不可变的,当您向列表中添加元素时,实际上您创建了一个新列表并保持旧列表不变.新列表可以是比原始列表更通用的类型.
在你的情况,你不小心绊了这个功能,因为只有共同的超类型Char和Symbol是Any.