隱含參數(shù)的另外一個(gè)用法是給前面明確定義的參數(shù)補(bǔ)充說(shuō)明一些信息。 我們先給出一個(gè)沒(méi)有使用隱含參數(shù)的例子:
def maxListUpBound[T <:Ordered[T]](element:List[T]):T =
element match {
case List() =>
throw new IllegalArgumentException("empty list!")
case List(x) => x
case x::rest =>
val maxRest=maxListUpBound(rest)
if(x > maxRest) x
else maxRest
}
這個(gè)函數(shù)是求取一個(gè)順序列表的最大值。但這個(gè)函數(shù)有個(gè)局限,它要求類型 T 是 Ordered[T]的一個(gè)子類,因此這個(gè)函數(shù)無(wú)法求一個(gè)整數(shù)列表的最大值。
下面我們使用隱含參數(shù)來(lái)解決這個(gè)問(wèn)題。 我們可以再定義一個(gè)隱含參數(shù),其類型為一函數(shù)類型,可以把一個(gè)類型T轉(zhuǎn)換成 Ordered[T]。
def maxListImpParam[T](element:List[T])
(implicit orderer:T => Ordered[T]):T =
element match {
case List() =>
throw new IllegalArgumentException("empty list!")
case List(x) => x
case x::rest =>
val maxRest=maxListImpParam(rest)(orderer)
if(orderer(x) > maxRest) x
else maxRest
}
在這個(gè)函數(shù)中,隱含參數(shù)使用中兩個(gè)地方,一個(gè)遞歸調(diào)用時(shí)傳入,第二個(gè)是檢查列表的表頭是否大于列表其余部分的最大值。這個(gè)例子的隱含參數(shù)給前面定義的類型T補(bǔ)充了一些信息,也就是如果比較兩個(gè)類型 T 對(duì)象。
這種用法非常普遍以至于 Scala 的庫(kù)缺省定義很多類型隱含的到 Ordered 類型的變換。例如我們調(diào)用這個(gè)函數(shù):
scala> maxListImpParam(List(1,5,10,34,23))
res2: Int = 34
scala> maxListImpParam(List(3.4,5.6,23,1.2))
res3: Double = 23.0
scala> maxListImpParam(List("one","two","three"))
res4: String = two
在這幾個(gè)調(diào)用中,編譯器自動(dòng)為函數(shù)添加了對(duì)應(yīng)的 orderer 參數(shù)。