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.
![]() | 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 Exceptionres0: 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. |

