以下两个sum函数声明有什么区别?
def sum[A](xs:List[A]) = .....
def sum[A <: List[A]](xs:A) = ....
修改 详细说明......
让我说我想在List上写一个方法头。
我可以写下如下:
def head[A](xs:List[A]) = xs(0)
或者我们可以写
def head[A <: List[A]] (xs:A) = xs(0)
哪一个更喜欢和什么时候?
注意:我发现一个区别是隐式转换不适用于第二个
答案 0 :(得分:4)
第一个采用List[A]
作为参数,第二个采用A
作为List[A]
的子类型。请考虑以下示例:
scala> trait Foo[A <: Foo[A]]
defined trait Foo
scala> class Bar extends Foo[Bar]
defined class Bar
当你想在trait中定义一个接受或返回子类类型的方法时,Foo
上的递归类型参数会很有用:
trait Foo[A <: Foo[A]] {
def f: A
}
class Bar extends Foo[Bar] {
def f: Bar = new Bar
}
class Baz extends Foo[Baz] {
def f: Baz = new Baz
}
我不知道你的具体例子应该如何运作,因为我不知道你将如何总结这种类型。