2011-07-26 69 views
1

我想寫的處理順序的功能,如:Scala的泛型

def wrap[A >: Seq[_], B](seq : A)(f :() => B): Option[B] = { 
    if(seq.isEmpty) None 
    else Some(f()) 
} 

但它不工作 錯誤:

error: value isEmpty is not a member of type parameter A 

如果(seq.isEmpty)無

我做錯了什麼?

回答

6

根本不需要說什麼A。只要說的第一個參數wrapSeq,那麼您可以在一個Seq或任何子及其傳:

def wrap[B](seq : Seq[_])(f :() => B): Option[B] = { 
    if(seq.isEmpty) None 
    else Some(f()) 
} 

wrap(List(1,2,3))(() => "hi") //returns Some("hi") 
+4

或者只是'seq.headOption.map(x => f())' –

+0

感謝您的回答 – artemka

4

你做了什麼不對的>:,你需要<:

A <: B意味着型A小於類型B,因爲如果將類型看作屬於它的所有值的集合,則在B中包含類型A。這是java A extends B>:是java A super B

這當然是自然的認爲AB越大,A報價是情況下,至少儘可能多的服務/擔保爲B情況下做的。但是子類型的通常符號(不僅在scala中)是包含的。

這就是說,@dhg答案是正確的,因爲你不需要這個特定問題的通用參數。