加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala indexOf接受一切

发布时间:2020-12-16 09:58:21 所属栏目:安全 来源:网络整理
导读:我把它写成了一个REPL: case class Thingy(s: String)val things = List(Thingy("x"),Thingy("y"))things.indexOf("x") 返回-1.但我原本以为它不会编译,因为“x”是一个字符串,而不是一个Thingy.实际上,事实证明你将什么类型放入indexOf并不重要: things.i
我把它写成了一个REPL:

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

返回-1.但我原本以为它不会编译,因为“x”是一个字符串,而不是一个Thingy.实际上,事实证明你将什么类型放入indexOf并不重要:

things.indexOf(42)
things.indexOf(java.time.LocalDate.now())

这些都返回-1.

indexOf有这个签名:

def indexOf[B >: A](elem: B): Int

我认为>:意味着B应该是A的超类型,但这些类都不是我的案例类Thingy的超类型.

我在这里错过了什么?

解决方法

B被推断为java.io.Serializable,它是String和Thingy.1的超类型

这是两件事的不幸后果:

> Scala的所有/大多数值共享的多余父类型(Any,Object,Serializable等).
>列出协变.2

将indexOf定义为

def indexOf(elem: A): Int

将A置于逆变位置,这是不允许的,因为它会违反Liskov替换原则:List [Thingy]是List [Any],你可以在List [Any]上调用.indexOf(“x”) ],因此你应该能够在List [Thingy]上调用.indexOf(“x”).

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读