scala - 为什么 Scala 将类型从 Char 强制转换为 Double?

标签 scala

下面的代码

object testType extends App {
  def func(x:Int) = if(x==0) 1.0 else 'c'
  println(func(0))
  println(func(1))
}

结果

1.0
99.0

起初当我写这个的时候,我以为 Scala 不会允许这样的函数,但它把这个函数解释为 (Int) => Double。这感觉就像类型强制。

如果我用 'c' 替换上面函数中的 "c",它实际上返回

1.0
c

函数现在被解释为 (Int) => Any

问题:如果 Scala 是强类型的,为什么第一个带有 'c' 的例子返回一个 Double 以及为什么 (Int) => Double(Int) => 这两个例子有什么吗?

最佳答案

Scala 中的类型之间存在一种关系,称为"weak conformance"。 . Char弱符合 Double (因为它弱符合 Int 而弱符合 Double )。 if (<cond>) then <e1> else <e2> 的类型是defined to be the weak least upper bound (wlub) of types of <e1> and <e2> (对于具有许多分支的其他表达式也有类似的规则:matchtry/catch)。 Char的wlub和 DoubleDouble ; String 的 wlub和 DoubleAny .

关于scala - 为什么 Scala 将类型从 Char 强制转换为 Double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39525314/

相关文章:

scala - Spark shell 命令行

scala - 将 Scala 应用程序作为 Java 应用程序运行

security - 如何使用 Scala 防止 Play [2.0] 中的 CSRF?

scala - Spark DataFrame 将 struct<.. 包装到 struct<. 的数组中

scala - 解构会在未来导致错误吗?

scala - 内联时缺少编译/运行时错误

json - 如何在spark scala中将json字符串解析到不同的列?

scala - 防止 Mixin 覆盖 equals 破坏 case class 相等

scala - Spark 应用程序中的垃圾收集时间非常长,导致程序停止

Scala 类型推断不适用于泛型案例类和 lambda