2011-04-05 4 views
1

申し訳ありませんが、既にカバーされている場合。次の簡単な動的タイピングと型境界の例は、文字列のリストでは機能しませんが、定義されたlength()関数を含む(scala)クラスではうまく動作します。これは予想される動作かバグですか?それは行動が期待されている場合、それは文字列のリストのために働くだろうと、このような拘束タイプは長さ(0機能を備えた任意のScalaのオブジェクトのリストをオブジェクトと同様に定義する方法はありますか?スカラ型の動的型付け、型境界およびJavaオブジェクト - これは予期される動作またはバグですか?

def sumlen[T <: {def length : Int}](l : List[T]) : Int = { 
    def sl(l : List[T], acc : Int) : Int = l match { 
     case Nil => acc 
     case h::t => sl(t, h.length + acc) 
    } 
    sl(l, 0) 
} 

val l1 = List("This", "is", "a", "test") 

sumlen(l1) 

答えて

2

これは、作品:。。。応答および解決のための

def sumlen[T <: {def length() : Int}](l : List[T]) : Int = { 
//       ^^ 

そして、はい、それは機能ではなく、バグです

+0

おかげで、この特定の「機能」の背後にある理由に興味があるだけのようにそれはと矛盾しそうです構文の残りの部分は、スカラネイティブクラスとJavaクラスを人為的に区別します。 – user693384

+0

@ user693384: 'def foo()'が 'def foo'とは異なるという特徴があります。通常、 'sumlen(List(List(1,2,3)、List(4,5,6)、List(7)、List(8)))')で修正されたバージョンを使用すると、 'def length()'と 'def length'は異なっていますが、この違いは特徴です。 2つのバージョンを作る必要があります。どこかにバグがある場合、 'String'の' length() 'は空のパラメータリストを取り、副作用がないのでパラメータがなくてはなりません。 – shellholic

+0

完璧です。ありがとう。 – user693384

関連する問題