- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
this后面是一道题.
现在我们已经证明了 Array[Int]
可以隐式转换为 Int => Int
,但是发生的地方是哪里?
显然,Int => Int
是一个函数:
scala> var fun = (i: Int) => Array(1,2,3)(i)
fun: Int => Int = <function1>
而Array[Int]
是一个类:
scala> var arr = Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3)
但是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
^
现在,隐式转换发生的地方在哪里?
最佳答案
既然你有WrappedArray
我猜你有 Scala 2.12 或更早版本 - Scala 2.13 有 ArrayOps
.
存在从Array
到WrappedArray
的隐式转换(实际上是a whole family o conversions)。所以你有一个从 Array[T]
到 WrappedArray[T]
的隐式转换。
现在,WrappedArray
实现了各种 Scala 的集合特征。其中之一是 Seq
实现 PartialFunction
(进而扩展 Function
)。这意味着 Scala 中的所有集合都是来自某个键的函数(Int
在序列的情况下,可能是其他的在 Map
的情况下)。这包括 WrappedArray
。
因此,您对 WrappedArray
的转换会自动将 Array[T]
转换为(a 的子类型)函数 Int => T
。
事实上,这就是为什么你应该避免将任何集合(或在 2.13 之前可隐式转换为集合的事物,如 Array
)放入隐式范围的原因:隐式范围中的集合自动成为隐式转换本身。此问题仅在 Scala 3 中得到解决,其中隐式转换变为 a separate subtype of Function
interface .
关于scala - 'Array[Int]'在scala中隐式转换为 'Int => Int'的地方在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70016392/
我是一名优秀的程序员,十分优秀!