gpt4 book ai didi

Scala indexOf 接受一切

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

我把它写进了一个 REPL:

case class Thingy(s: String)
val things = List(Thingy("x"), Thingy("y"))
things.indexOf("x")

返回 -1 .但我原以为它不会编译,因为 "x"String ,而不是 Thingy .事实上,事实证明,您放入 indexOf 的类型并不重要。 :
things.indexOf(42)
things.indexOf(java.time.LocalDate.now())

这些都返回-1。
indexOf有这个签名:
def indexOf[B >: A](elem: B): Int

我以为 >:表示 B应该是 A 的父类(super class)型, 但这些类都不是我的案例类 Thingy 的父类(super class)型.

我在这里想念什么?

最佳答案

B推断为 java.io.Serializable ,它是 String 的父类(super class)型和 Thingy .1

这是两件事的不幸结果:

  • Scala 的所有/大多数值共享的多余父类型(AnyObjectSerializable 等)。
  • List是协变的。2

  • 定义 indexOf作为
    def indexOf(elem: A): Int

    会放 A在逆变位置,这是不允许的3,因为它会违反 Liskov 替换原则:A List[Thingy]List[Any] ,您可以调用 .indexOf("x")List[Any] ,因此您应该可以调用 .indexOf("x")List[Thingy] .

    1 如果他们都没有碰巧实现 Serializable , 它仍然会推断 Any .

    2 这是首选不变量集合的原因,例如 scalaz.IList .

    3 试一试 - 它不会编译: trait Foo[+A] { def bar(a: A) }

    关于Scala indexOf 接受一切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067271/

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