,該Set
參數將被「展開」到全類型:
scala> type Set = Int => Boolean
defined type alias Set
scala> def foo(s : Set, i : Int) = ???
foo: (s: Int => Boolean, i: Int)Nothing
當你」重新使用Set(1,2,3)
,您使用的同伴對象的apply
方法,它返回一個不同的類型:
scala> val set = Set(4,1,2)
set: scala.collection.immutable.Set[Int] = Set(4, 1, 2)
而且,你可能會注意到,收集集合是通用在這裏。儘管(別名是Set[T]
),你也可以創建一個通用類型別名,所以仍然可能存在一些混淆。
解決方案?使用一個完整的類型名稱:
scala> def filterHead(s : scala.collection.immutable.Set[Int], setFunc : Set) = setFunc(s.head)
filterHead: (s: scala.collection.immutable.Set[Int], setFunc: Int => Boolean)Boolean
或者給你的別名不同的名稱:
type SetFunc = Int => Boolean
,或者在一個通用的方法:
type SetFunc[T] = T => Boolean
甚至導入scala.collection.immutable.Set[T]
下一個不同名稱 - 導入時的別名。
在上面的代碼片段中,'s:Set'本質上是':Int => Boolean',因爲你已經爲'Set'定義了一個別名。這不是指'集合'集,所以沒有'頭'開頭... –
,但工作表給出了這個輸出 'val set = Set(1,2,3)' 'set.head //> res2:Int = 1' –