4.2. Słaba zgodność i typ wyrażenia warunkowego

Typ rezultatu wyrażenia warunkowego zawierającego klauzulę else zależy od typów obu podwyrażeń występujących w tym wyrażeniu i jest najmniejszym możliwym typem pozostającym z typami obu podwyrażeń w relacji słabej zgodności. Relacja słabej zgodności dwóch typów A i B jest definiowana osobno dla typów liczbowych oraz dla innych typów.

W przypadku, gdy A i B są typami wartości liczbowych, to między tymi typami zachodzi relacja słabej zgodności, gdy A jest po lewej stronie B na rysunku 4.1.

Rysunek 4.1 — Relacje słabej zgodności między typami wartości liczbowych

Podobne relacje pomiędzy typami wartości liczbowych obowiązują w zasadach dotyczących konwersji między tymi typami, które są opisane w punkcie 3.3.

W innym przypadku, między typami A i B zachodzi relacja słabej zgodności, gdy A jest nadtypem B.

W przypadku skróconej wersji wyrażenia warunkowego, czyli wyrażenia bez klauzuli else, rezultat tego wyrażenia jest taki, jakby było to wyrażenie z klauzulą else, w której jest umieszczone wyrażenie ().

Poniższe przykłady ilustrują zasady obowiązujące przy ustalaniu typu wyrażenia warunkowego.

scala> if (true) 1 else throw new Exception 
res0: Int = 1

scala> if (true) 1 else () 
res1: AnyVal = 1

scala> if (true) 1 else 1.0 
res2: Double = 1.0

scala> if (true) 1:Byte else 1:Char 
res3: Int = 1

Typem wyrażenia throw new Exception z wiersza jest Nothing, a typem wyrażenia 1 jest Int. Typ rezultatu całego wyrażenia z tego wiersza, czyli Int, jest wspólnym nadtypem typów Int i Nothing. Wyrażenie () z wiersza ma typ Unit. Najmniejszym wspólnym nadtypem Int i Unit jest AnyVal i ten typ jest typem wyrażenia z wiersza . Wyrażenia 1 i 1.0 z wiersza mają typy Int i Double. Typem rezultatu całego wyrażenia z tego wiersza jest Double, który jest ich najmniejszym wspólnym nadtypem zgodnie z relacją słabej zgodności. Wyrażenia 1:Byte i 1:Char z wiersza są wyrażeniami z typem. Takie wyrażenie ma po dwukropku jawnie określony typ. Wartością wyrażenia jest wartość tej części wyrażenia, która znajduje się przed dwukropkiem, przekształcona do typu określonego po dwukropku. W przypadku wyrażeń 1:Byte i 1:Char przed dwukropkiem znajduje się wartość 1 typu Int. W przypadku pierwszego z omawianych wyrażeń, wartość przekształcana jest na wartość typu Byte, a w przypadku drugiego, na wartość typu Char. Wyrażenia te mają więc odpowiednio typy Byte i Char. Typ Int, będący typem całego wyrażenia z wiersza , jest ich najmniejszym wspólnym nadtypem zgodnie z relacją słabej zgodności.

Specyfikacja języka Scala opisuje wyrażenie z typem w punkcie 6.13, wyrażenie warunkowe w punkcie 6.16, a relację słabej zgodności w punkcie 3.5.3.

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.