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 zapobiega generacji ostrzeżenia kompilatora związanego z wymagającym użycia mechanizmu reflekcji odwołaniem do składnika typu strukturalnego. Ma to związek z tak zwanymi flagami funkcjonalności opisanymi w punkcie 13.5.

Specyfikacja języka Scala opisuje typy złożone w punkcie 3.2.7.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.