Table of Contents
Scala FAQ: How do I override the default numeric type that Scala assigns when I declare an Int
, Long
, Short
, Float
, or Double
val or var field?
Solution
If you assign 1
to a variable, Scala assigns it the type Int
:
scala> val a = 1 a: Int = 1
Usually this is a good thing, but if you want something else, like a Long
,Short
, etc., you need to tell Scala what numeric type you want. The following examples show one way to override simple numeric types:
scala> val a = 1d a: Double = 1.0 scala> val a = 1f a: Float = 1.0 scala> val a = 1000L a: Long = 1000
Another approach is to annotate the variable with a type, like this:
scala> val a = 0: Byte a: Byte = 0 scala> val a = 0: Int a: Int = 0 scala> val a = 0: Short a: Short = 0 scala> val a = 0: Double a: Double = 0.0 scala> val a = 0: Float a: Float = 0.0
Spacing after the colon isn’t important, so you can use this format, if preferred:
val a = 0:Byte
According to the Scala Style Guide, those examples show the preferred style for annotating types, but I personally prefer the following syntax when assigning types to variables, specifying the type after the variable name:
scala> val a: Byte = 0 a: Byte = 0 scala> val a: Int = 0 a: Int = 0
Hex values
You can create hex values by preceding the number with a leading 0x
or 0X
, and you can store them as an Int
or Long
:
scala> val a = 0x20 a: Int = 32 // if you want to store the value as a Long scala> val a = 0x20L a: Long = 32
In some rare instances, you may need to take advantage of type ascription. A post on Stack Overflow shows a case where it’s advantageous to upcast a String
to an Object
. The technique is shown here:
scala> val s = "Dave" s: String = Dave scala> val p = s: Object p: Object = Dave
As you can see, the technique is similar to this recipe. This upcasting is known as type ascription. The official Scala documentation describes type ascription as follows:
Ascription is basically just an up-cast performed at compile time for the sake of the type checker. Its use is not common, but it does happen on occasion. The most often seen case of ascription is invoking a varargs method with a single
Seq
parameter.
Discussion
It’s helpful to know about this approach when creating object instances. The general syntax looks like this:
// general case var [name]:[Type] = [initial value] // example var a:Short = 0
This form can be helpful when you need to initialize numeric var
fields in a class:
class Foo { var a: Short = 0 // specify a default value var b: Short = _ // defaults to 0 }
As shown, you can use the underscore character as a placeholder when assigning an initial value. This works when creating class variables, but doesn’t work in other places, such as inside a method. For numeric types this isn’t an issue -- you can just assign the type the value zero -- but with most other types, you can use this approach inside a method:
var name = null.asInstanceOf[String]
Better yet, use the Option/Some/None pattern. It helps eliminate null values from your code, which is a very good thing. You’ll see this pattern used in the best Scala libraries and frameworks, such as the Play Framework. An example of this approach is shown in Recipe 12.4 of the Scala Cookbook, “How to Process Every Character in a Text File.”
See Also
- See Recipe 20.5 of the Scala Cookbook, “Eliminate null Values from Your Code,” and Recipe 20.6, “Using the Option/Some/None Pattern,” for more discussion of this topic.
- The Scala Style Guide
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |