Ponekad je potrebno izraziti da je tip objekta podtip nekoliko drugih tipova. U Scali ovo može biti izraženo pomoću složenih tipova, koji su presjeci tipova objekata.
Pretpostavimo da imamo dva trejta: Cloneable
i Resetable
:
trait Cloneable extends java.lang.Cloneable {
override def clone(): Cloneable = {
super.clone().asInstanceOf[Cloneable]
}
}
trait Resetable {
def reset: Unit
}
Pretpostavimo da želimo napisati funkciju cloneAndReset
koja prima objekt, klonira ga i resetuje originalni objekt:
def cloneAndReset(obj: ?): Cloneable = {
val cloned = obj.clone()
obj.reset
cloned
}
Postavlja se pitanje koji bi trebao biti tip parametra obj
.
Ako je Cloneable
onda objekt može biti clone
-iran, ali ne i reset
-ovan;
ako je Resetable
onda se može reset
, ali ne i clone
.
Da bi izbjegli kastovanje tipa u ovoj situaciji, možemo navesti tip obj
da bude oboje Cloneable
i Resetable
.
Ovaj složeni tip u Scali se piše kao: Cloneable with Resetable
.
Ovo je ažurirana funkcija:
def cloneAndReset(obj: Cloneable with Resetable): Cloneable = {
//...
}
Složeni tipovi mogu se sastojati od više tipova i mogu imati jednu rafinaciju koja može biti korištena da suzi potpis postojećih članova objekta.
General forma je: A with B with C ... { refinement }
Primjer za upotrebu rafinacije dat je na stranici o apstraktnim tipovima.
Contributors to this page:
Contents
- Uvod
- Osnove
- Sjedinjeni tipovi
- Klase
- Podrazumijevane vrijednosti parametara
- Imenovani parametri
- Trejtovi
- Tuples
- Kompozicija mixin klasa
- Funkcije višeg reda
- Ugniježdene metode
- Curry-jevanje
- Case klase
- Podudaranje uzoraka (pattern matching)
- Singlton objekti
- Regularni izrazi
- Ekstraktor objekti
- For komprehensije
- Generičke klase
- Varijanse
- Gornja granica tipa
- Donja granica tipa
- Unutarnje klase
- Apstraktni tipovi
- Složeni tipovi
- Self-tipovi
- Implicitni parametri
- Implicitne konverzije
- Polimorfne metode
- Lokalno zaključivanje tipova (type inference)
- Operatori
- By-name parametri
- Anotacije
- Packages and Imports
- Package Objects