scala中的子类型多态性

时间:2014-05-31 07:26:18

标签: scala subtype

以下两个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)

哪一个更喜欢和什么时候?

注意:我发现一个区别是隐式转换不适用于第二个

1 个答案:

答案 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
}

我不知道你的具体例子应该如何运作,因为我不知道你将如何总结这种类型。