使用以下代碼:
object Foo {
val arr: Int => Int = Array(1,2,3)
}
我們可以呼叫Foo.arr(1),然后獲取2。但是,arr在物件中Foo應該是一個Function. Thearr是 Class 的一個實體,WrappedArray$ofInt顯然不是一個Function.
我猜可能是WrappedArray$ofIntimplements的原因apply(i: Int),因為呼叫Array(1,2,3)(1)會被翻譯成Array(1,2,3).apply(1). 但是下面的代碼會出錯:
class Bar {
def apply(i: Int): Int = {
Array(1,2,3)(i)
}
}
object Foo {
val arr: Int => Int = new Bar() //Type mismatch:
// Required: Int => Int
// Found: Bar
}
現在,為什么val arr: Int => Int = Array(1,2,3)在 Scala 中是允許的?
uj5u.com熱心網友回復:
Array(1,2,3)是 type Array[Int],泛型型別Array[T]宣告了一個apply(index: Int): T帶有簽名的方法Int => T,考慮到任何帶有apply方法的型別都可以被認為是一個簽名相同的函式,那么Array[Int]是一個有效的Int => Int。
uj5u.com熱心網友回復:
您問題的第二部分是您應該明確使用 apply 的最罕見情況之一。
val elem: Int => Int = new Bar().apply(_)
通常寫成
val bar = new Bar()
val elem: Int => Int = bar(_)
或者
val elem: Int => Int = x => new Bar()(x)
我依稀記得在某處讀到的原因是“是這樣”或“規范是這樣”,不記得是哪個。試圖找到那個帖子,但找不到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358546.html
標籤:斯卡拉
