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

来源:互联网 发布:教育行业知乎 编辑:程序博客网 时间:2024/05/21 06:45

大数据系列修炼-Scala课程43:类型参数的广泛应用


核心内容:
1、Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析


1、Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析

1>所谓泛型类就是在类定义的时候,在类名的后面加一个[],在[]中指定它的类型为一个未知的类型,即T。此时就说这个类是一个泛型类。
2>类型变量的限定(界定)分为两种类型:类型变量的上界与类型变量的下界。
3>通过类型变量的限定,我们可以方便的表达出类型变量具有某些需要的特征和方法。
4>类型变量的上界定义方式:T<:Comparable[T],此时Comparable[T]即为T的上界,并具有相应的compareTo方法
5>类型变量的下界定义方式:def replaceFirst[R>:T],此时T即为R的下界。


实例程序1:

package IT03;//Scala中类型变量上界的先验知识储备//本程序的目的是实现Comparable接口中compareTo方法:凡是需要进行比较排序的类对象都应该实现Comparable接口中compareTo方法public class App1{    public static void main(String[] args)   {     //凡是需要进行比较排序的类都应该实现Comparable接口中的compareTo方法     Student student1 = new Student("zhang",80.0);     Student student2 = new Student("lisi",90.0);     int value = student1.compareTo(student2);     System.out.println(value);     System.out.println("------------");     //凡是Java中自带的数据类型都具有compareTo方法     System.out.println("zhang".compareTo("lisi"));     System.out.println(new Double(80.0).compareTo(new Double(70.0)));   }     }class Student implements Comparable<Student>  //泛型在具体使用的时候应该被定义{   public String name;   public Double score;   public Student(){}   public Student(String name,Double score)   {       this.name = name;       this.score = score;   }   public String toString()   {       return this.name +"\t" +this.score;   }   public int compareTo(Student obj)   {      return(int)((this.score - obj.score));   }}

实例程序2:

package IT03import scala.reflect.ClassTag//类型变量的上界实例化程序:上届的<:这种方式类似与Java中的extends机制object App {        //本程序的目的是掌握Scala中类型变量Bounds代码实战,其在Spark中的应用源码解析的相关应用     def main(args:Array[String]):Unit=           {           val aa = new A[String]("zhang","ang") //凡是Java中自带的数据类型都已经实现了compareTo方法         println(aa.bigger())     }}class A[T<:Comparable[T]](val first:T,val second:T) //我们希望T这个泛型类具有Comparable接口中的compareTo方法{    //比较first和second这两个属性到底谁大    def bigger() = if(first.compareTo(second) > 0) first else second}

实例程序3:

package IT03//类型变量的上届的实例化程序2object App8{    def main(args:Array[String]):Unit=    {         val bb = new B[Student](new Student("zhang",80),new Student("lisi",90))        println(bb) //IT03.B@a298b7    }  }class Student(val name:String,val score:Int) extends Comparable[Student]{   override def compareTo(obj:Student):Int = this.score - obj.score}class Worker(val name:String,val salary:Double) //Worker这个类就不能带入到T中,因为没有实现compareTo方法//注意:T这个泛型前提必须要实现Comparable接口中的compareTo方法:Java中自带的数据类型都已已经实现了,因此用户自定义的必须要//前提先实现这个接口中的compareTo方法class B[T<:Comparable[T]](val first:T,val second:T){   def bigger = if(first.compareTo(second)>0) first else second }

实例程序4:

package IT03object App9 {   //本程序的目的是测试Java中类型变量的下界   def main(args:Array[String]):Unit=   {      //本节这个下界知识点我用下面的实例程序来进行说明:不太准确吧????      val aa = new Pair_Fan[Persion](new Persion,new Persion)      val bb = new Pair_Fan[Teacher](new Teacher,new Teacher)   }}class Pair_Lower[T](val first:T,val second:T){   def replaceFirst[R>:T](newFirst:R) = new Pair_Lower(newFirst,second)   //R相当于Persion,T相当于Student}class Persion{}class Teacher extends Persion{}class Pair_Fan[Teacher](val fisrt:Teacher,val second:Teacher){}

实例程序5:


这里写图片描述


实例程序6:
思考:在类型变量的上界定义当中,A<:B,其中B应该是Java或Scala自带的数据类型,否则没有意义!!


实例程序7:

object App2{  def main(args : Array[String]): Unit =  {      //对T类型进行上界的约束:即传进来的T类型必须是Comparable类型或者是Comparable接口的子类型      def bigger[T <: Comparable[T]](first:T,second:T): T =      {        if(first.compareTo(second) > 0) first else second      }      println(bigger[String]("Spark","Hadoop"))      var aa = new A[String]("Spark","Hadoop")      aa.fun("Java","Hadoop")  }}class A[F](var first:F,var second:F){  def fun[T>:F](newfirst:T) = new A[T](newfirst,second)}

这里写图片描述

0 0