隐式方法
隐式转换必须有 implicit 关键字,命名习惯为:源方法 2 目标方法,二者的参数类型需要保持一致。
import java.io.File
import scala.io.Source
/**
* Created by Administrator on 2018/10/8 16:08 in Beijing.
*/
class AdvanceFile(val file: File) {
def read = Source.fromFile(file).mkString("")
}
object ImplicitTest {
//隐式方法
implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)
def main(args: Array[String]) {
println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)
}
}
输出如下
Scala 隐式转换几年前就玩过了
Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明
Process finished with exit code 0
隐式参数
在参数前添加 implicit 关键字的参数。
import java.io.File
import scala.io.Source
/**
* Created by Administrator on 2018/10/8 16:08 in Beijing.
*/
class AdvanceFile(val file: File) {
def read = Source.fromFile(file).mkString("")
}
object ImplicitTest {
//隐式方法
implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)
//隐式参数
implicit val default : String = "Java"
//函数的柯里化Currying
def curryString(frameWork: String)(implicit language:String) = {
frameWork + " based on " + language
}
def main(args: Array[String]) {
//println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)
println(curryString("Spark")("Scala"))
println(curryString("Kafka")("Scala"))
println(curryString("Hadoop")) //注意这个
}
}
输出如下
Spark based on Scala
Kafka based on Scala
Hadoop based on Java
Process finished with exit code 0
隐式类
下面,通过 隐式类 来实现上述 隐式方法 一样的功能。
package programming_In_Scala
import java.io.File
import scala.io.Source
/**
* Created by Administrator on 2018/10/8 16:08 in Beijing.
*/
/*class AdvanceFile(val file: File) {
def read = Source.fromFile(file).mkString("")
}*/
object ImplicitTest {
//隐式方法
//implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)
//隐式参数
implicit val default : String = "Java"
//函数的柯里化Currying
def curryString(frameWork: String)(implicit language:String) = {
frameWork + " based on " + language
}
//隐式类
implicit class FileAdvance(val file: File) {
def read = Source.fromFile(file).mkString("")
}
def main(args: Array[String]) {
println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)
}
}
输出如下
Scala 隐式转换几年前就玩过了
Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明
Process finished with exit code 0
方法 在调用时,会检测 当前 有没有 直接方法 可以调用。如果没有,则去查找当前的类下的引式类,找到隐式类中与当前参数匹配的方法,找到对应的方法进行调用。如果都没有找到,则编译失败。
隐式对象
import java.io.File
import scala.io.Source
/**
* Created by Administrator on 2018/10/8 16:08 in Beijing.
*/
/*class AdvanceFile(val file: File) {
def read = Source.fromFile(file).mkString("")
}*/
// 抽象类:Template[T],具有泛型T
abstract class Template[T] {
// 定义add方法,参数:泛型x:T, y:T 并且返回T对象
def add(x: T, y: T): T
// 定义抽象方法,返回T对象
def none: T
}
object ImplicitTest {
//隐式方法
//implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)
//隐式参数
implicit val default : String = "Java"
//函数的柯里化Currying
def curryString(frameWork: String)(implicit language:String) = {
frameWork + " based on " + language
}
//隐式类
implicit class FileAdvance(val file: File) {
def read = Source.fromFile(file).mkString("")
}
//隐式对象
implicit object AddInt extends Template[Int] {
override def add(x: Int, y: Int): Int = x + y
override def none: Int = 0
}
//隐式对象
implicit object AddString extends Template[String] {
override def add(x: String, y: String): String = x + "_" + y
override def none: String = ""
}
// Template[T] 根据传入参数T的类型 调用对应的隐式对象
def sum[T](list: List[T])(implicit template: Template[T]): T = {
if (list.isEmpty) {
template.none
}else {
template.add(list.head, sum(list.tail))
}
}
def main(args: Array[String]) {
//println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)
//println(curryString("Spark")("Scala"))
//println(curryString("Kafka")("Scala"))
//println(curryString("Hadoop")) //注意这个
println(sum(list = List(1, 2, 3, 4, 5)))
println(sum(list = List("C", "Java", "Scala", "Python", "Go")))
}
}
输出如下
15
C_Java_Scala_Python_Go_
Process finished with exit code 0