【发布时间】:2011-05-25 02:58:02
【问题描述】:
我想在scala中定义一个list[Char],但是犯了一个错误。我错过了“b”后面的单引号字符。但是我得到了一个 List[Any] 实例。是 Scala 的 bug 还是正常的结果?
scala> val list = List('a',**'b**,'c','d')
list: List[Any] = List(a, 'b, c, d)
【问题讨论】:
我想在scala中定义一个list[Char],但是犯了一个错误。我错过了“b”后面的单引号字符。但是我得到了一个 List[Any] 实例。是 Scala 的 bug 还是正常的结果?
scala> val list = List('a',**'b**,'c','d')
list: List[Any] = List(a, 'b, c, d)
【问题讨论】:
这不是错误。单字符前导表示 Scala 中的符号。我只是知道。 对不起。我只是 Scala 的初学者。
【讨论】:
正如 woods 已经回答的那样,'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。
【讨论】: