gpt4 book ai didi

scala - 本地分配影响类型?

转载 作者:行者123 更新时间:2023-12-04 13:58:26 25 4
gpt4 key购买 nike

在下面的例子中, f3 可以接受一个 Iterable[Array[Int]]

  def f3(o:Iterable[Iterable[Any]]):Unit = {}

f3(Iterable(Array(123))) // OK. Takes Iterable[Array[Int]]

但是如果我将 Iterable[Array[Int]] 分配给一个局部变量,它不能:
  val v3 = Iterable(Array(123))
f3(v3) // Fails to take Takes Iterable[Array[Int]]

有错误:
  Error:(918, 10) type mismatch;
found : Iterable[Array[Int]]
required: Iterable[Iterable[Any]]
f3(x)

什么软糖?为什么第一个例子有效,而不是秒。它似乎与嵌套泛型有关:
  def f(o:Iterable[Any]):Unit = {}
f( Array(123))
val v1 = Array(123)
f(v1) // OK

def f2(o:Iterable[Any]):Unit = {}
f2( Iterable(Array(123)))
val v2 = Array(123)
f(v2) // OK

使用 Scala.2.11

最佳答案

首先,重要的是Array不延长 Iterable (因为它是 Java 类型)。取而代之的是来自 Array[A] 的隐式转换。至 Iterable[A] ,所以预期的类型很重要。

第一种情况:Iterable(Array(123))f3 的参数因此使用预期类型 Iterable[Iterable[Any]] 进行类型检查.所以Array(123)使用预期类型进行了类型检查 Iterable[Any] .那么,它的实际类型是Array[Int]并且编译器插入转换(因为 Iterable[Int] 符合 Iterable[Any] )。所以这实际上是 Iterable(array2iterable(Array(123)) (我不记得确切的名字)。

在第二种情况下 f3有类型 Iterable[Array[Int]] : val f3 = ...中没有什么可以触发隐式转换行,对吗?并且没有来自 Iterable[Array[Int]] 的隐式转换至 Iterable[Iterable[Int]] (或者,更一般地说,当存在从 Iterable[A]Iterable[B] 的隐式转换时,从 AB ),因此下一行无法编译。您可以自己编写此转换,但这无济于事,例如转换 Array[Array[Int]]Iterable[Iterable[Int]] .

当然,如果你使用 Iterable[Any] ,再次没有什么可以触发隐式转换!

关于scala - 本地分配影响类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37930402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com