W Scali parametry typów oraz typy abstrakcyjne mogą być warunkowane przez ograniczenia typów. Tego rodzaju ograniczenia pomagają określić konkretne wartości zmiennych typu oraz odkryć więcej informacji na temat elementów tych typów. Ograniczenie górne typu T <: A
zakładają, że zmienna T
jest podtypem typu A
.
Poniższy przykład demonstruje zastosowanie ograniczeń górnych typu dla parametru typu klasy Cage
:
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 Cage[P <: Pet](p: P) {
def pet: P = p
}
object Main extends App {
var dogCage = new Cage[Dog](new Dog)
var catCage = new Cage[Cat](new Cat)
/* Nie można włożyć Lion do Cage, jako że Lion nie jest typu Pet. */
// var lionCage = new Cage[Lion](new Lion)
}
Instancja klasy Cage
może zawierać Animal
z górnym ograniczeniem Pet
. Obiekt typu Lion
nie należy do klasy Pet
, zatem nie może być włożony do obiektu Cage
.
Zastosowanie dolnych ograniczeń typów jest opisane tutaj.
Contributors to this page:
Contents
- Wprowadzenie
- Podstawy
- Hierarchia typów
- Klasy
- Domyślne wartości parametrów
- Parametry nazwane
- Cechy
- Krotki
- Kompozycja klas przez domieszki
- Funkcje wyższego rzędu
- Funkcje zagnieżdżone
- Rozwijanie funkcji (Currying)
- Klasy przypadków
- Dopasowanie wzorców (Pattern matching)
- Obiekty singleton
- Wzorce wyrażeń regularnych
- Obiekty ekstraktorów
- For Comprehensions
- Klasy generyczne
- Wariancje
- Górne ograniczenia typów
- Dolne ograniczenia typów
- Klasy wewnętrzne
- Typy abstrakcyjne
- Typy złożone
- Jawnie typowane samoreferencje
- Parametry domniemane
- Konwersje niejawne
- Metody polimorficzne
- Lokalna inferencja typów
- Operatory
- Parametry przekazywane według nazwy
- Adnotacje
- Pakiety i importy
- Obiekty pakietu