3.3. Konwersje liczbowych typów danych

Oprócz wspomnianych wcześniej konwersji typu Int na Byte, Short i Char, Scala dokonuje również innych niejawnych konwersji pomiędzy typami wartości liczbowych. Rysunek 3.1 ilustruje między jakimi typami te konwersje mogą być dokonywane.

Rysunek 3.1 — Konwersje między typami wartości liczbowych

Podobne, jak powyższe, relacje pomiędzy typami wartości liczbowych obowiązują w zasadach dotyczących słabej zgodności typów opisanych w punkcie 4.2.

Możliwość dokonywania opisanych niejawnych konwersji jest w specyfikacji opisana jako „Numeric Widening” w punkcie 6.26.1.

Na przykład poniższa definicja jest poprawna, mimo że użyty literał definiuje wartość typu Int, a wymagana jest wartość typu Float — na rysunku 3.1 istnieje przejście od typu Int do typu Float.

scala> val a:Float = 1
a: Float = 1.0

Na rysunku 3.1 przejścia w drugą stronę nie ma. Poniższa definicja jest niepoprawna.

scala> val b:Int = 1.0f
<console>:10: error: type mismatch;
 found   : Float(1.0)
 required: Int
       val b:Int = 1.0f
                   ^

Scala umożliwia dokonywanie jawnych konwersji między typami wartości liczbowych poprzez wywoływanie na instancji typu, z którego chcemy dokonać konwersji, metody o nazwie składającej się z przedrostka „to” oraz nazwy typu, na który chcemy dokonać konwersji. Przykłady takich konwersji są pokazane poniżej.

scala> val c = 1.toFloat
c: Float = 1.0

scala> val d = (1.0).toInt
d: Int = 1

scala> val e = 2.toLong
e: Long = 2

scala> val f = 0xAB0F.toByte
f: Byte = 15

scala> val g = (1.4d).toShort
g: Short = 1

W definicjach wartości f i g nastąpiła, oprócz konwersji, zmiana wartości (utrata części danych) — typ danych, na który dokonano konwersji (odpowiednio Byte i Short), nie był w stanie reprezentować całej konwertowanej wartości.

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.