我想寫的處理順序的功能,如: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)無
我做錯了什麼?
我想寫的處理順序的功能,如: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)無
我做錯了什麼?
根本不需要說什麼A
。只要說的第一個參數wrap
是Seq
,那麼您可以在一個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")
你做了什麼不對的>:
,你需要<:
A <: B
意味着型A
小於類型B
,因爲如果將類型看作屬於它的所有值的集合,則在B
中包含類型A
。這是java A extends B
。 >:
是java A super B
。
這當然是自然的認爲A
比B
越大,A
報價是情況下,至少儘可能多的服務/擔保爲B
情況下做的。但是子類型的通常符號(不僅在scala中)是包含的。
這就是說,@dhg答案是正確的,因爲你不需要這個特定問題的通用參數。
或者只是'seq.headOption.map(x => f())' –
感謝您的回答 – artemka