2011-04-05 39 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

感謝您的答覆和解決方案只是好奇,這背後的特殊「功能」的理由似乎有不一致其餘的語法和人工區分scala-native和java類。 – user693384 2011-04-06 15:33:51

+0

@ user693384:功能是'def foo()'與'def foo'不同。通常情況下,如果使用sumlen(List(List(1,2,3),List(4,5,6),List(7),List(8)))'修正後的版本,它將不會像def length()和def長度是不同的,這個差別是一個特徵。你必須製作兩個版本。如果某個地方存在bug,那就是'String'上的'length()'接受一個空的參數列表,並且應該更無參數,因爲它是無副作用的。 – shellholic 2011-04-06 17:12:53

+0

具有完美的感覺。謝謝。 – user693384 2011-04-06 19:28:36