【问题标题】:Is this a bug of Scala, when defining a list such as :在定义如下列表时,这是 Scala 的错误吗:
【发布时间】: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 scala-2.8


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      正如 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 类型的列表是不可变的,并且当您向列表中添加元素时,实际上是创建了一个新列表,而旧列表保持不变。并且新列表可以是比原始列表更通用的类型。

      在你的例子中,你偶然发现了这个特性,因为 CharSymbol 的唯一常见超类型是 Any

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多