上类型超过子类型的优势

时间:2015-12-09 15:27:51

标签: scala

在这个例子中使用上限类型而不仅仅是类型有什么好处?

为什么人们更喜欢这个

trait Pages[T <: Page] {
  val pages: Seq[T]
  def find(id: String): Option[T] = pages.find(_.id == id)
  def all: Seq[T] = pages
}

通过这个:

trait Pages {
  val pages: Seq[Page]
  def find(id: String): Option[Page] = pages.find(_.id == id)
  def all: Seq[Page] = pages
}

2 个答案:

答案 0 :(得分:4)

与第二个例子优于

的优点相同
trait Pages {
  val pages: Seq[Any]
  def find(id: String): Option[Any] = pages.find(_.id == id)
  def all: Seq[Any] = pages
}

:更精确的类型,允许您不要混淆Page的不同子类型,以便在不进行投射的情况下访问MyPage的操作等。

此外,如果你有第一个并需要第二个,你可以使用Pages[Page];如果你有第二个,需要第一个,那你就不走运了。

答案 1 :(得分:0)

好的,我发现在第一种情况下我可以明确指定类型。 如果MyPagePage,则val pages = new Pages[MyPage]{ override val pages: Seq[MyPage] = List(MyPage("a"), MyPage("b")) } 为子类型。

pages.find("a")

编译器可以推断出类型,以便MyPage成为Page类型。在第二个示例中,类型始终为{{1}},强制转换它。