我想为进程序列编写一个函数,如下所示:
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
if(seq.isEmpty)无
我做错了什么?
答案 0 :(得分:6)
根本不需要对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")
答案 1 :(得分:4)
你做错了是>:
,你需要<:
A <: B
表示类型A
小于B
类型,因为如果您将类型视为属于它的所有值的集合,请键入{{1} }包含在A
类型中。这是java B
。 A extends B
是java >:
。
当然,A super B
大于A
的情况当然很自然,因为B
的实例至少提供与A
的实例一样多的服务/保证做。但是,通常用于子类型的符号(不仅仅是scala)也包含在内。
话虽如此,@ dhg的回答是正确的,因为你不需要这个特定问题的泛型参数。