How to Uses of implicit in Scala
-
implicitas a Parameter Value Injector in Scala -
implicitas a Type Converter in Scala -
implicitas an Extension Method in Scala
This article will discuss the different uses of implicit in Scala.
implicit as a Parameter Value Injector in Scala
Implicit parameters are passed to a method with the implicit keyword in Scala.
The values are taken from the context (scope) in which they are called. In simple words, if no value or parameter is passed to a function, then the compiler looks for an implicit value and passes it as a parameter.
Example 1:
object MyClass {
def test(a:Int) = a
def main(args: Array[String]) {
test //calling the function but this gives error as no value is passed
}
}
Here we called a function without passing any parameter value. This leads to an error. Scala compiles that first; it tries to pass a value, but it will not get the parameter’s direct value.
Example 2:
object MyClass {
def test(implicit a:Int) = a
def main(args: Array[String]):Unit= {
test
}
}
Here we called a function with a parameter with the implicit keyword. The Scala compiler will look for any val in the same scope with the same value type.
If found, it compiles successfully; else, we get an error. So, as there is no value in the scope of the same type, the above program gives an error.
Example 3:
object MyClass {
def test(implicit a:Int) = a
implicit val b:Int =789
def main(args: Array[String]):Unit= {
println(test)
}
}
Output:
789
The above code runs successfully because the compiler finds an implicit val with the same type int as the implicit parameter a in the function.
implicit as a Type Converter in Scala
We can also use implicit keywords to convert one data type.
We convert string to int type in the code below.
object MyClass {
def main(args: Array[String]):Unit= {
val str :String = "hero"
val x:Int = str //we get error here
}
}
Since string is not a sub-type of int, it will error. The Scala compiler looks for an implicit function in the scope which takes string as an argument and returns an int.
Here is another simple example.
object MyClass {
implicit def myfunc(a:String):Int = 500
def main(args: Array[String]):Unit= {
val str :String = "hero"
val x:Int = str // the compiler treats this as myfunc(str) and return 500
println(x)
}
}
Output:
500
The above code perfectly runs because when the Scala compiler looks for an implicit function, it finds and treats val x:Int = str as myfunc(str) and returns 500.
implicit as an Extension Method in Scala
Suppose we add a new method to the integer object, converting the meter to the centimeter. We create an implicit class inside an object to achieve this.
This implicit class will have only one constructor parameter.
Below is a complete code example to better understand how it works.
object MyObject {
implicit class mtoCm(m:Int){
def mToCm={
m*100
}
}
}
We can implement this using the following code.
import MyObject._
object workspace {
def main(args: Array[String]):Unit= {
println(3.mToCm) //calling the mtoCm from MyObject
}
}
Output:
300
This imports the defined implicit class, which we want to use from the above code.
