6.2. Typ złożony
Poniższy przykład pokazuje inną możliwość jawnego zadeklarowania typu tworzonej wartości instancji klasy HiWithHello z pliku Traits2.scala. Wartość h ma tak zwany typ złożony.
scala> val h: Hi with Hello = new HiWithHello h: Hi with Hello = HiWithHello@4deff2
Na obiekcie h można wywołać metody dziedziczone zarówno z klasy Hi, jak i cechy Hello.
scala> h.hi + h.hello res0: String = Hi!Hello!
Typ złożony ma następującą postać:
T with S with … with U { R }
Symbole T, S, … U oznaczają typy, a { R } oznacza tak zwane ulepszenie. Ulepszenie { R } można pominąć. W takim przypadku dodawane jest domyślnie ulepszenie puste { }. Typ złożony może się również składać z samego ulepszenia. Wtedy typ { R } jest odpowiednikiem AnyRef{ R }. Typ złożony reprezentuje obiekty, które posiadają składowe odpowiadające składowym zadeklarowanym i zdefiniowanym w typach T, S, … U i w ulepszeniu { R }.
Ulepszenie może zawierać deklaracje i definicje typów. Te deklaracje i definicje mogą nadpisywać deklaracje i definicje z typów T, S, … U. Deklaracja lub definicja, która tego nie robi, nazywana jest „strukturalną”.
Poniższe przykłady pokazują kilka innych, możliwych do zastosowania przy użyciu typów złożonych, deklaracji typu instancji klasy HiWithHello.
scala> val g: Hi { def hello: String } = new HiWithHello
g: Hi{def hello: String} = HiWithHello@1ab013
scala> g.hi
res1: String = Hi!
scala> import language.reflectiveCalls
import language.reflectiveCalls
scala> g.hello
res2: String = Hello!
scala> val k: Hello { def hi: String } = new HiWithHello
k: Hello{def hi: String} = HiWithHello@ec2cc4
scala> k.hi
res3: String = Hi!
scala> k.hello
res4: String = Hello!
scala> val m: { def hello: String; def hi: String } = new HiWithHello
m: AnyRef{def hello: String; def hi: String} = HiWithHello@120ca2b
scala> m.hi
res5: String = Hi!
scala> m.hello
res6: String = Hello!
![]() | Klauzula importu z wiersza Specyfikacja języka Scala opisuje typy złożone w punkcie 3.2.7. |

