[英]Advantage of Upper Type Bound over Subtyping
在此示例中,使用上限類型而不是僅類型有什么好處?
為什么人們喜歡這個
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
}
這與第二個示例相比的優勢相同
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]
; 如果您擁有第二個並且需要第一個,那么您就不走運了。
好的,我發現在第一種情況下,我可以顯式指定類型。 如果MyPage
是Page
子類型。
val pages = new Pages[MyPage]{
override val pages: Seq[MyPage] = List(MyPage("a"), MyPage("b"))
}
並且編譯器可以推斷類型,以便pages.find("a")
將成為MyPage
類型。 在第二個示例中,類型始終為Page
,強制將其強制轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.