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.
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. |