2011-07-26 7 views
1

私はこのように、プロセスシーケンスのための機能を書きたい:Scalaのジェネリック

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

しかし、それは エラー動作しません:(seq.isEmpty)なし

場合

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

どうしたのですか?

答えて

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") 
+4

または単に 'seq.headOption.map(x => f())' –

+0

答えをありがとう – artemka

4

>:で、あなたは<:

A <: Bを必要とするタイプAを意味し、型がBよりも小さい場合、その型をその型に属するすべての値のセットと考えると、A型が型Bに含まれています。これはjava A extends Bです。 >:はjava A super Bです。

それは、少なくともとして多くのサービス/保証がBのインスタンスがそうであるようにAオファーのものの場合には、ABよりも大きいことを考えるのは当然の自然です。しかし、サブタイプの通常の記法(スカラーだけではない)は包含のためのものです。

言われているように、@ dhg答えはこの特定の問題のためのジェネリックパラメータを必要としない点で正しいです。

関連する問題