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等). 将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)} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |