在 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
的子類型。 Dog
和 Cat
是 Pet
的子類型,因此我們可以建立新的 PetContainer[Dog]
和 PetContainer[Cat]
。但是,如果我們嘗試建立 PetContainer[Lion]
,就會收到以下錯誤
類型引數 [Lion] 不符合類別 PetContainer 的類型參數範圍 [P <: Pet]
這是因為 Lion
不是 Pet
的子類型。