这是一个玩具示例:
object Example {
import collection.mutable
import collection.immutable.TreeSet
val x = TreeSet(1, 5, 8, 12)
val y = mutable.Set.empty ++= x
val z = TreeSet.empty ++ y
// This gives an error: unspecified parameter
// val z = TreeSet.empty() ++ y
}
显然TreeSet.empty
和TreeSet.empty()
不是一回事。引擎盖下发生了什么?我什么时候可以安全地省略(或在这种情况下不省略)括号?
我已经将一些代码发送到控制台,然后在eval上面的代码中将其删除,然后再执行以下代码:
implicit object StringOrdering extends Ordering[String] {
def compare(o1: String, o2: String) = {
o1.length - o2.length
}
}
object StringOrdering1 extends Ordering[String] {
def compare(o1: String, o2: String) = {
o2.length - o1.length
}
}
答案 0 :(得分:5)
这是一个特殊情况,并且与您何时可以且不能省略括号非常相关。
这是TreeSet.empty
的签名:
def empty[A](implicit ordering: Ordering[A]): TreeSet[A]
它有一个隐式参数列表,对于包含的类型Ordering
,需要A
。当您调用TreeSet.empty
时,编译器将尝试隐式找到正确的Ordering[A]
。
但是当你调用TreeSet.empty()
时,编译器认为你试图显式提供隐式参数。除了你在列表中省略了参数,这是一个编译错误(错误的参数数量)。唯一可行的方法是,如果您明确传递了一些Ordering
:TreeSet.empty(Ordering.Int)
。
旁注:您的上述代码实际上并未使用TreeSet.empty
进行编译,因为它会导致Ordering
的模糊隐式错误。您的范围中可能存在一些隐含的Ordering[Int]
,您不在问题中。最好使类型明确并使用TreeSet.empty[Int]
。