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