gpt4 book ai didi

scala - 将两个类型通配符标识为相同

转载 作者:行者123 更新时间:2023-12-05 00:24:05 24 4
gpt4 key购买 nike

假设我们定义一个接口(interface)为:

trait Foo[A] {
val value: A
def perform(v: A): Unit
}

并编译此代码:
val n: Foo[_] = null
n.perform(n.value)

它看起来很完美......但我们得到了一个神秘的错误:
error: type mismatch;
found : n.value.type (with underlying type _$1)
required: _$1
n.perform(n.value)
^

那么……为什么会发生这种情况?我知道如何解决这个问题;我只是好奇。谢谢!

最佳答案

您在这里没有使用原始类型,而是使用了通配符类型。这类似于 Java 的

List<?> list = null;
list.add(list.get(0));

它不会编译,因为编译器分几个步骤工作:
  • n.value返回时,编译器将该值标记为表示通配符。
  • 方法n.perform在编译器只知道参数是另一个通配符的情况下执行。

  • 然而,两个通配符不一定相同。相反,发行了两个通配符。为了进行此调用,您需要应用所谓的 get-and-put principle . get an put 原则基本上意味着您暂时命名通配符类型,以便 Scala 编译器可以推断出两个通配符是相同的。这样做,以下代码编译:
    val n: Foo[_] = null
    def rebox[A](x: Foo[A]) = x.perform(x.value)
    rebox(n)

    并抛出 NullPointerException .

    关于scala - 将两个类型通配符标识为相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27100217/

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