您的位置:首页 > 大数据

大数据系列修炼-Scala课程64

2016-10-01 18:02 405 查看
大数据系列修炼-Scala课程64

核心内容:

1、Scala中隐式对象操作代码实战

1、Scala中隐式对象操作代码实战
1>所谓隐式对象,就是在object对象前面有implicit关键字

2>隐式对象可以作为隐式值进行使用

3>在Scala当中,标注类型的时候可以直接用类和特质的名字来引用其类型,要引用对象的类型,需要用对象的type成员来引用其类型,而不能直接用object的名字来引用其类型

实例程序1:

abstract class A
{
def fun():Unit
}
object B extends A
{
def fun() = println("Spark")  //抽象方法被实现
}
object App
{
def main(args:Array[String]):Unit =
{
def fun(obj:A) = obj.fun()
fun(B)  //静态对象可以做为参数进行使用
}
}


实例程序2:

abstract class Template[T]
{
def add(x:T,y:T):T
}
abstract class SubTemplate[T] extends Template[T]   //定义一个抽象的泛型类
{
def unit:T
}
object App
{
def main(args:Array[String]):Unit =
{
implicit object StringAdd extends SubTemplate[String]
{
def add(x:String,y:String):String = x concat y
def unit:String = ""
}
implicit object IntAdd extends SubTemplate[Int]  //scala中单例对象也可以继承类
{
def add(x:Int,y:Int):Int = x + y
def unit:Int = 0
}
def sum[T](xs:List[T])(implicit m:SubTemplate[T]):T=
{
if(xs.isEmpty) m.unit else m.add(xs.head, sum(xs.tail))
}
println(sum[String](List("Spark","Hadoop","Hbase"))(StringAdd))  //StringAdd隐式值可以省略
println(sum(List(10,20,30))(IntAdd))//IntAdd隐式值可以省略
}
}


注意:在上面的程序中,m是隐式对象,如果T是int,则使用IntAdd这个隐式对象,如果T是String,则使用StringAdd这个隐式对象。

实例程序3:自己编写的程序

abstract class A
{
def fun():Unit
}
object App
{
def main(args:Array[String]):Unit =
{
implicit object B extends A
{
def fun() = println("Spark")
}
def g(str:String)(implicit obj:A)
{
println(str)
}
g("Spark")(B)
g("Hadoop")
}


深度思考1:下面的程序竟然不报错?????

object App
{
def main(args : Array[String]): Unit =
{
trait S1{def fun():Unit}

implicit object S2 extends S1{
override def fun() = println("1111111222")
}
implicit var s1 = new S1{
override def fun() = println("66666666633")}

def g(str:String)(implicit arg:S1) = arg.fun()
g("Spark")
}
}


如有问题,欢迎留言指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: