这是一个问题this https://stackoverflow.com/questions/70000384/why-val-arr-int-int-array1-2-3-is-allowed-in-scala.
现在我们已经证明了Array[Int]
可以隐式转换为Int => Int
, but where发生的地点是什么?
明显地,Int => Int
是一个函数:
scala> var fun = (i: Int) => Array(1,2,3)(i)
fun: Int => Int = <function1>
And Array[Int]
是一个类:
scala> var arr = Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3)
But arr
可以分配给fun
:
scala> fun = arr
fun: Int => Int = WrappedArray(1, 2, 3)
反之,则不会起作用:
scala> arr = fun
<console>:34: error: type mismatch;
found : Int => Int
required: Array[Int]
arr = fun
^
现在,那个地方在哪里implicit发生转换吗?
既然你有WrappedArray https://www.scala-lang.org/api/2.12.x/scala/collection/mutable/WrappedArray.html我猜你有 Scala 2.12 或更早版本 - Scala 2.13 有ArrayOps https://www.scala-lang.org/api/2.13.x/scala/collection/ArrayOps.html.
有一个隐式转换(实际上整个家庭 o 皈依 https://www.scala-lang.org/api/2.12.x/scala/Predef%24.html#genericWrapArray%5BT%5D(xs:Array%5BT%5D):scala.collection.mutable.WrappedArray%5BT%5D) from Array
to WrappedArray
。所以你有一个隐式转换Array[T]
to WrappedArray[T]
.
Now, WrappedArray
实现了 Scala 的各种集合特征。其中之一是Seq https://www.scala-lang.org/api/2.12.x/scala/collection/Seq.html实施PartialFunction
(这反过来又延伸Function
)。这意味着 Scala 中的所有集合都是来自某个键的函数 (Int
在序列的情况下,可能是其他的情况Map
s)。这包括WrappedArray
.
所以你的转换为WrappedArray
自动变成Array[T]
进入一个(a的子类型)函数Int => T
.
事实上,这就是为什么你应该避免放置任何集合(或隐式转换为集合的东西,例如Array
2.13 之前)进入隐式作用域:隐式作用域中的集合自动变成隐式转换本身。这个问题仅在 Scala 3 中得到解决,隐式转换变成了的一个单独的子类型Function界面 https://docs.scala-lang.org/scala3/reference/contextual/conversions.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)