Scala 调用函数时的类型声明?

Scala 调用函数时的类型声明?,scala,Scala,调用bar函数时,可以在函数声明中指定类型。但这意味着什么呢 Scala 2.11.6,ScalaIDE 4.1.0 def foo(a: Int, b: String, c: Object) = { //it compiles but what :Int means here? bar(a: Int, b: String, c: Object) } def bar(a: Int, b: String, c: Object) = { println(a, b, c) } 这仅仅意

调用bar函数时,可以在函数声明中指定类型。但这意味着什么呢

Scala 2.11.6,ScalaIDE 4.1.0

def foo(a: Int, b: String, c: Object) = {
  //it compiles but what :Int means here?
  bar(a: Int, b: String, c: Object)
}

def bar(a: Int, b: String, c: Object) = {
  println(a, b, c)
}
这仅仅意味着您明确地告诉编译器参数
a
的类型是
Int
(依此类推)。通常,如果您不这样做,编译器会在调用
bar
时推断参数的类型。通过手动放置,您明确地告诉它将其推断为
Int
String
对象

注意这与安装[]不同。i、 e.您的呼叫不是以下内容的同义词:

bar(a.asInstanceOf[Int], b.asInstanceOf[String], c.asInstanceOf[Object])
使用
asInstanceOf
,您将迫使编译器相信它是给定的类型。i、 e.编译器不再使用头部来证明
a
Int
。使用
bar(a:Int,b:String,c:Object)
可以帮助它进行推断。注意:这是一个编译器错误,因为它无法将
a
转换为
String

bar(a: String, b: Int, c: String)

这些不是类型注释,而是

归属

类型归属通常与类型注释混淆,如 Scala中的语法是相同的。下面是一些例子 归属:

Nil:列表[字符串]

设置(值:*)

“Daniel”:AnyRef

归属是 基本上只是在编译时为了 类型检查器。它的使用并不普遍,但它确实发生在 场合最常见的归属案例是调用varargs 具有单个Seq参数的方法。这是通过将
.*
键入(如上面的第二个示例所示)

归属遵循类型注释约定;一个空格紧跟其后 结肠

当编译器的帮助不够时,它特别有助于类型推断:

scala> List(1,2,3).foldRight(Nil)(_ :: _)
<console>:8: error: type mismatch;
 found   : List[Int]
 required: scala.collection.immutable.Nil.type
              List(1,2,3).foldRight(Nil)(_ :: _)
                                           ^

scala> List(1,2,3).foldRight(Nil: List[Int])(_ :: _)
res1: List[Int] = List(1, 2, 3)
scala>List(1,2,3).foldRight(Nil)(::)
:8:错误:类型不匹配;
找到:列表[Int]
必需:scala.collection.immutable.Nil.type
列表(1,2,3).foldRight(无)
^
scala>List(1,2,3).foldRight(Nil:List[Int])()
res1:List[Int]=List(1,2,3)
scala> List(1,2,3).foldRight(Nil)(_ :: _)
<console>:8: error: type mismatch;
 found   : List[Int]
 required: scala.collection.immutable.Nil.type
              List(1,2,3).foldRight(Nil)(_ :: _)
                                           ^

scala> List(1,2,3).foldRight(Nil: List[Int])(_ :: _)
res1: List[Int] = List(1, 2, 3)