Tôi mới đến Scala, và tôi đang gặp khó khăn để hiểu tại sao đôi khi tôi không nhận được một lỗi loại khi cung cấp các luận cứ sai lầm khi Set.contains
Scala Set.contains không cho loại dự kiến không phù hợp lỗi
Dưới đây là ví dụ nhanh sử dụng REPL (2.9.1.final):
scala> val baz = Map("one" -> 1, "two" -> 2)
baz: scala.collection.immutable.Map[java.lang.String,Int] = Map(one -> 1, two -> 2)
scala> baz.values.toSet.contains("asdf")
res3: Boolean = false
Tại sao tôi không nhận được loại không phù hợp ở đó?
Nếu tôi gán baz.values.toSet
-val
khác, và gọi contains
trên đó, tôi làm được kiểm tra kiểu:
scala> val bling = baz.values.toSet
bling: scala.collection.immutable.Set[Int] = Set(1, 2)
scala> bling.contains("asdf")
<console>:10: error: type mismatch;
found : java.lang.String("asdf")
required: Int
bling.contains("asdf")
^
sai lầm ngu ngốc, tinh tế ngôn ngữ, hoặc biên dịch lỗi?
Câu trả lời ngắn: ngôn ngữ tinh tế (subtyping và suy luận kiểu) –