답변:
scala> println (Nil == List())
true
scala> println (Nil eq List())
true
scala> println (Nil equals List())
true
scala> System.identityHashCode(Nil)
374527572
scala> System.identityHashCode(List())
374527572
무기한은 관용적이며 대부분의 경우에 바람직 할 수 있습니다. 질문이 있으십니까?
List[A]()
(되지 Nil
foldLeft위한 누산기 값 필요)? 예- 여기서 누산기로 scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
사용하면 Nil
작동하지 않습니다.
Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
사용자 알 수 없음Nil
및 모두의 런타임 값이 List()
동일한 것으로 나타났습니다 . 그러나 정적 유형은 다음과 같습니다.
scala> val x = List()
x: List[Nothing] = List()
scala> val y = Nil
y: scala.collection.immutable.Nil.type = List()
scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true
cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean
scala> cmpTypes(x, y)
res0: Boolean = false
scala> cmpTypes(x, x)
res1: Boolean = true
scala> cmpTypes(y, y)
res2: Boolean = true
이는 폴드 누산기와 같이 유형을 유추하는 데 사용될 때 특히 중요합니다.
scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x)
res6: List[Int] = List(3, 2, 1)
scala> List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
^
y :: x
작동 합니다. 문제는 반환되는 형식이 예상 한 형식이 아니라는 것입니다. List[Int]
예상되는 유형이 List[Nothing]
또는 Nil.type
(나는 전자이지만 아마도 후자라고 생각 합니다 ) 동안을 반환합니다 .
Nil
더 관용적 이라고 말할 수 있습니다.