【问题标题】:Strange scala.collection.immutable.Set adding behavior [duplicate]奇怪的scala.collection.immutable.Set添加行为[重复]
【发布时间】:2014-02-11 17:55:05
【问题描述】:

为什么这段代码不起作用:

val xs = Set(1, 4, 8)
xs + 1.5

<console>:10: error: type mismatch;
found   : Double(1.5)
required: Int
          xs + 1.5

但这没关系:

val xs = Set(1, 4, 8)
xs.toSet + 1.5

res1: scala.collection.immutable.Set[AnyVal] = Set(1, 4, 8, 1.5)

那么?

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    toSet 是这样声明的:

    def toSet[B >: A]: Set[B] 
    Converts this immutable set to a set.
    

    简而言之,它返回一个新的Set[B],其中B 可以是AA 的任何超类型。

    在执行xs.toSet + 1.5 时,您没有明确声明类型B。因此,现在类型推断开始确定类型。它看到xsInt 类型的集合,而1.5 是一个Double。类型推断现在尝试找到可以将 Double 作为参数的类型。

    下一个常见的 Int 和 Double 类型是 AnyVal。因此B = AnyVal,你得到一个新的结果集Set[AnyVal]。如果您明确指定类型,那么它显然会失败,即

    scala> xs.toSet[Int] + 2.4
    <console>:9: error: type mismatch;
     found   : Double(2.4)
     required: Int
                  xs.toSet[Int] + 2.4
    

    更多参考:reference §6.26.4。类似的question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2023-04-09
      • 2013-06-28
      • 2015-07-26
      • 2020-04-26
      • 2015-08-17
      相关资源
      最近更新 更多