撰写List(1,2,3).toSet()
而不是List(1,2,3).toSet
时会发生什么?第一个表达式返回Boolean
。为什么呢?
答案 0 :(得分:6)
写List(1,2,3).toSet()
相当于:
List(1,2,3).toSet(())
List(1,2,3).toSet.apply(())
List(1,2,3) toSet ()
List(1,2,3).toSet apply ()
也就是说,您的通话中的()
不是空的apply
。这是Unit
。因此toSet
会将List
转换为Set
。编译器看到()
,但知道apply
上没有空Set
方法,所以它假定您必须尝试在没有Set#apply
的情况下调用()
括号,并将$ scala -deprecation
scala> List(1,2,3).toSet()
<console>:11: warning: Adaptation of argument list by inserting () has been deprecated: this is unlikely to be what you want.
signature: GenSetLike.apply(elem: A): Boolean
given arguments: <none>
after adaptation: GenSetLike((): Unit)
List(1,2,3).toSet()
^
作为参数传递给它。
这很令人困惑,这就是不推荐使用这种用法的原因。
var image = new Image;
image.crossOrigin="anonymous"; /* THIS WILL MAKE THE IMAGE CROSS-ORIGIN */
image.src = source;
注意那些弃用警告。
答案 1 :(得分:2)
它等同于Bergi提到的.Set .apply()。
但还有更多;因为apply()方法需要elem: A
参数,但在这里我们只是使用toSet()而没有给出任何东西,编译器调整帮助我们(但可能不应该)并将其更改为
GenSetLike((): Unit)
满足签名,但不推荐使用,请检查here.
编辑:如果使用-deprecated运行repl,您应该看到警告
<console>:11: warning: Adaptation of argument list by inserting () has been deprecated: this is unlikely to be what you want.
signature: GenSetLike.apply(elem: A): Boolean
given arguments: <none>
after adaptation: GenSetLike((): Unit)
List(1,2,3).toSet.apply()
res1: Boolean = false