在这个例子中使用上限类型而不仅仅是类型有什么好处?
为什么人们更喜欢这个
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
}
答案 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)
好的,我发现在第一种情况下我可以明确指定类型。
如果MyPage
为Page
,则val pages = new Pages[MyPage]{
override val pages: Seq[MyPage] = List(MyPage("a"), MyPage("b"))
}
为子类型。
pages.find("a")
编译器可以推断出类型,以便MyPage
成为Page
类型。在第二个示例中,类型始终为{{1}},强制转换它。