[英]why does Scala function accepts case class type for a function argument?
考慮代碼塊。
class Evaluation {
def evaluate= {
println("Charlie...")
}
}
case class Dept(name:String) extends Evaluation
def depEval(name:String,f:(String) => Evaluation) ={
println(name)
f(name).evaluate
}
depEval("abc", Dept)
為什么Dept可以作為Funtion1類型傳遞? 就是這樣,Scala不會在解析參數之前檢查類型。
考慮其他片段
def matchingCase(f: String => Evaluation)= {
println(f.toString())
f match {
case Dept => println("function type matched")
}
}
matchingCase((x: String)=> Dept(x))
而在上面的代碼中,scala給出了匹配錯誤,正如預期的那樣。
案例類的伴隨對象擴展了FunctionX[T1, T2, <CaseClass>]
因此您可以使用它來構造案例類的實例。
因此,例如,如果您有案例類
case class Foo(i: Int, s: String)
編譯器將生成一個伴隨對象
object Foo extends (Int, String) ⇒ Foo with Product2[Int, String] {
def apply(i: Int, s: String) = new Foo(i, s)
// and some other stuff such as equals, hashCode, copy
}
這使您可以像下面這樣構造Foo
的實例:
Foo(42, "Hello")
代替
new Foo(42, "Hello")
因此,可以得出結論:之所以可以將Dept
隨行對象作為函數傳遞,是因為它是一個函數。
Dept
不是“案例類類型”,它是案例類的伴侶object
。 它擴展了Function1
(並具有.apply
方法,這是接口的一部分),因此您可以在需要函數的任何地方使用它。
第二個失敗的原因是{ x => Dept(x) }
是它自己的匿名函數,而不是Dept
對象。
這很有道理,因為如果您只是給Dept
做為paramenter,它將表現為一個以String為參數的ass函數,並返回Dept類的實例,這意味着一個Dept對象(就像給new
或apply函數作為參數),請注意以下代碼也有效:
val c: Dept.type = Dept
val dep = c("Name1")
dep
res1:部門=部門(Name1)
dep.evaluate
查理... res2:單位=()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.