2017-09-15 106 views
0

一個同事寫了下面的代碼:Scala - 如何調用一個類型的泛型子類型的方法?

def nonEmpty[Coll[_], T](implicit ev: Coll[T] <:< TraversableOnce[T]): Coll[T] => Boolean = 
     (coll: Coll[T]) => coll.nonEmpty 

這樣做的目的是要能夠調用nonEmptyTraversable[T]任何亞型。但是,這感覺過於複雜。我試圖簡化它,但目前爲止還沒有運氣。我試過例如: -

def nonEmpty2[Coll[T] <:< TraversableOnce[T]](coll: Coll[T]): Boolean = coll.nonEmpty 

但是被拒絕,Wrong parameterColl[T]了。它只是一個句法(或一系列的語法問題)?什麼是最簡單的方法來編寫nonEmpty方法?

+2

首先,它是位於類型位置的<<:而不是<<:'。其次,def nonEmpty2(coll:TraversableOnce [_])= coll.nonEmpty'有什麼問題?它將與任何子類型(這是整個繼承點)一起工作。 –

+0

謝謝!我喜歡你的解決方案。 – Frank

回答

2

沒有必要指定您正在處理包含某種其他類型的通用(更高版本)類型。只需要一個類型參數:

def nonEmpty2[T](coll: T)(implicit ev: T <:< TraversableOnce[_]): Boolean = coll.nonEmpty 
+0

謝謝。我也喜歡這個解決方案! – Frank

+2

正如Oleg的評論所顯示的那樣,實際上需要零類型參數:)如果在返回類型中使用它,我只在這裏包含'T',但事實並非如此。 –

相關問題