Scala的泛型

时间:2011-07-26 15:18:29

标签: 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

if(seq.isEmpty)无

我做错了什么?

2 个答案:

答案 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 BA extends B是java >:

当然,A super B大于A的情况当然很自然,因为B的实例至少提供与A的实例一样多的服务/保证做。但是,通常用于子类型的符号(不仅仅是scala)也包含在内。

话虽如此,@ dhg的回答是正确的,因为你不需要这个特定问题的泛型参数。