2011-07-15 22 views
8

スカラ型境界システムを理解する上で問題があります。私は何をしようとしていることは、私がこれまで持っているどのようなタイプAの項目を反復処理することができますタイプTの項目を保持するホルダークラスを作るです:スカラ型パラメータの境界

class HasIterable[T <: Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

val hello = new HasIterable("hello") 

自体は正常にコンパイルクラスが、作成しようとしました私はその場合のHasIterable[String, Char]として解決するためにhelloを期待しているだろう

<console>:11: error: inferred type arguments [java.lang.String,Nothing] do 
not conform to class HasIterable's type parameter bounds [T <: Iterable[A],A] 
    val hello = new HasIterable("hello") 
      ^

hello値は私に、このエラーが発生します。この問題はどのように解決されますか?

答えて

17

String自体はIterable[Char]のサブタイプではありませんが、そのpimpWrappedString、です。あなたの定義は暗黙の型変換を利用することを可能にするために、あなたの代わりにupper type bound<:)のview bound<%)を使用する必要があります。

class HasIterable[T <% Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

今、あなたの例では動作します:

scala> val hello = new HasIterable("hello")    
hello: HasIterable[java.lang.String,Char] = [email protected] 
+1

うあなたはなぜこれがうまくいくのかを説明しています。 – dhg

+0

これは私のために働いた、ありがとう!そして、なぜ、<%はこの場合に働きますか?私はあなたの編集を見る。ありがとう:) – Dylan

+0

@pelotom:素晴らしい説明。ありがとう! – dhg

関連する問題