Scala 導覽

上界類型

語言

在 Scala 中,類型參數抽象類型成員可能會受到類型約束。此類型的約束限制類型變數的具體值,並可能揭露更多關於此類成員的資訊。上界類型T <: A宣告類型變數T指的是類型A的子類型。以下是一個展示PetContainer類別類型參數的上界類型的範例

abstract class Animal {
 def name: String
}

abstract class Pet extends Animal {}

class Cat extends Pet {
  override def name: String = "Cat"
}

class Dog extends Pet {
  override def name: String = "Dog"
}

class Lion extends Animal {
  override def name: String = "Lion"
}

class PetContainer[P <: Pet](p: P) {
  def pet: P = p
}

val dogContainer = new PetContainer[Dog](new Dog)
val catContainer = new PetContainer[Cat](new Cat)
abstract class Animal:
  def name: String

abstract class Pet extends Animal

class Cat extends Pet:
  override def name: String = "Cat"

class Dog extends Pet:
  override def name: String = "Dog"

class Lion extends Animal:
  override def name: String = "Lion"

class PetContainer[P <: Pet](p: P):
  def pet: P = p

val dogContainer = PetContainer[Dog](Dog())
val catContainer = PetContainer[Cat](Cat())
// this would not compile
val lionContainer = new PetContainer[Lion](new Lion)
// this would not compile
val lionContainer = PetContainer[Lion](Lion())

類別 PetContainer 採用類型參數 P,而該參數必須是 Pet 的子類型。 DogCatPet 的子類型,因此我們可以建立新的 PetContainer[Dog]PetContainer[Cat]。但是,如果我們嘗試建立 PetContainer[Lion],就會收到以下錯誤

類型引數 [Lion] 不符合類別 PetContainer 的類型參數範圍 [P <: Pet]

這是因為 Lion 不是 Pet 的子類型。

此頁面的貢獻者