Pol*_*ase 2 types scala equality equals subtyping
==运营商是否真的按内容比较List?特别是关于空列表?
以下比较按预期工作
List("A", "B", "C") == "ABC".split("").toList // true
List() == List() // true
List.empty[String] == List.empty[String] // true
Run Code Online (Sandbox Code Playgroud)
但是,不同类型的空列表比较会产生令人困惑的结果:
List.empty[String] == List.empty[Int] // true: on different types?
Run Code Online (Sandbox Code Playgroud)
编辑:在最初的问题,我做了一个误导性的测试案例,安德烈已经澄清了.谢谢.转载于此
val emptyStrSplit = "".split("").toList // List("") and not List() as displayed in Console
List.empty[String] == emptyStrSplit // false: b/c List() != List("")
Run Code Online (Sandbox Code Playgroud)
List.empty[String]是单例对象Nil,它扩展List[Nothing](covariantly,subtype List[String]).List.empty[Int]是单例对象Nil,它扩展List[Nothing](covariantly,subtype List[Int]).Nil == Nil给予真实.所以,基本上,你有一个Nil同时属于类型List[String]和类型的对象List[Int].如果你有子类型,这就是你得到的.我在这里看不到任何奇怪或矛盾的东西.
如果要确保类型相同,可以使用带有默认值implicit的类型证据,然后检查编译器是否提供了非证据:A =:= Bnullnull
def eqSameType[A, B](a: A, b: B)(implicit ev: A =:= B = null) =
if (ev == null) false else a == b
Run Code Online (Sandbox Code Playgroud)
例:
scala> eqSameType(List.empty[Int], List.empty[String])
res4: Boolean = false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |