文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java Scala泛型方法怎么使用

2023-07-05 21:07

关注

本文小编为大家详细介绍“Java Scala泛型方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java Scala泛型方法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1. 泛型

泛型的意思是泛指某种具体的数据类型, 在Scala中, 泛型用[数据类型]表示. 在实际开发中, 泛型一般是结合数组或者集合来使用的, 除此之外, 泛型的常见用法还有以下三种:

1.1 泛型方法

泛型方法指的是把泛型定义到方法声明上, 即:该方法的参数类型是由泛型来决定的. 在调用方法时, 明确具体的数据类型.

格式

def 方法名[泛型名称](..) = {    //...}

需求

定义方法getMiddleElement(), 用来获取任意类型数组的中间元素.

参考代码

//案例: 泛型方法演示.//细节: 泛型方法在调用方法的时候 明确具体的数据类型.object ClassDemo01 {  //需求: 用一个方法来获取任意类型数组的中间的元素  //思路一:不考虑泛型直接实现(基于Array[Int]实现)  //def getMiddleElement(arr: Array[Int]) = arr(arr.length / 2)  //思路二: 加入泛型支持  def getMiddleElement[T](arr: Array[T]) = arr(arr.length / 2)  def main(args: Array[String]): Unit = {      //调用方法      println(getMiddleElement(Array(1, 2, 3, 4, 5)))      println(getMiddleElement(Array("a", "b", "c")))  }}

1.2 泛型类

泛型类指的是把泛型定义到类的声明上, 即:该类中的成员的参数类型是由泛型来决定的. 在创建对象时, 明确具体的数据类型.

格式

class 类[T](val 变量名: T)

需求

参考代码

//案例: 泛型-演示泛型类的使用.//泛型类: 在创建对象的时候, 明确具体的数据类型.object ClassDemo02 {  //1. 实现一个Pair泛型类  //2. Pair类包含两个字段,而且两个字段的类型不固定  class Pair[T](var a:T, var b:T)  def main(args: Array[String]): Unit = {    //3. 创建不同类型泛型类对象,并打印    var p1 = new Pair[Int](10, 20)    println(p1.a, p1.b)    var p2 = new Pair[String]("abc", "bcd")    println(p2.a, p2.b)  }}

1.3 泛型特质

泛型特质指的是把泛型定义到特质的声明上, 即:该特质中的成员的参数类型是由泛型来决定的. 在定义泛型特质的子类或者子单例对象时, 明确具体的数据类型.

格式

trait 特质A[T] {  //特质中的成员}class 类B extends 特质A[指定具体的数据类型] {  //类中的成员}

需求

参考代码

//案例: 演示泛型特质.object ClassDemo03 {  //1. 定义泛型特质Logger, 该类有一个a变量和show()方法, 都是用Logger特质的泛型.  trait Logger[T] {    //定义变量    val a:T    //定义方法.    def show(b:T) = println(b)  }  //2. 定义单例对象ConsoleLogger, 继承Logger特质.  object ConsoleLogger extends Logger[String]{    override val a: String = "张三"  }  //main方法, 作为程序的主入口.  def main(args: Array[String]): Unit = {    //3. 打印单例对象ConsoleLogger中的成员.    println(ConsoleLogger.a)    ConsoleLogger.show("10")  }}

2. 上下界

在使用泛型(方法, 类, 特质)时,如果要限定该泛型必须从哪个类继承、或者必须是哪个类的父类。此时,就需要使用到泛型的上下界

2.1 上界

使用T <: 类型名表示给类型添加一个上界,表示泛型参数必须要从该类(或本身)继承.

格式

[T <: 类型]

例如: [T <: Person]的意思是, 泛型T的数据类型必须是Person类型或者Person的子类型

需求

参考代码

//案例: 演示泛型的上下界之  上界.object ClassDemo04 {  //1. 定义一个Person类  class Person  //2. 定义一个Student类,继承Person类  class Student extends Person  //3. 定义一个demo泛型方法,该方法接收一个Array参数,  //限定demo方法的Array元素类型只能是Person或者Person的子类  def demo[T <: Person](arr: Array[T]) = println(arr)  def main(args: Array[String]): Unit = {    //4. 测试调用demo,传入不同元素类型的Array    //demo(Array(1, 2, 3))          //这个会报错, 因为只能传入Person或者它的子类型.    demo(Array(new Person()))    demo(Array(new Student()))  }}

2.2 下界

使用T >: 数据类型表示给类型添加一个下界,表示泛型参数必须是从该类型本身或该类型的父类型.

格式

[T >: 类型]

注意:

例如: [T >: Person]的意思是, 泛型T的数据类型必须是Person类型或者Person的父类型如果泛型既有上界、又有下界。下界写在前面,上界写在后面. 即: [T >: 类型1 <: 类型2]

需求

参考代码

//案例: 演示泛型的上下界之 下界.//如果你在设定泛型的时候, 涉及到既有上界, 又有下界, 一定是: 下界在前, 上界在后.object ClassDemo05 {  //1. 定义一个Person类  class Person  //2. 定义一个Policeman类,继承Person类  class Policeman extends Person  //3. 定义一个Superman类,继承Policeman类  class Superman extends Policeman  //4. 定义一个demo泛型方法,该方法接收一个Array参数,  //限定demo方法的Array元素类型只能是Person、Policeman  //          下界          上界  def demo[T >: Policeman <: Policeman](arr: Array[T]) = println(arr)  def main(args: Array[String]): Unit = {    //5. 测试调用demo,传入不同元素类型的Array    //demo(Array(new Person))    demo(Array(new Policeman))    //demo(Array(new Superman))     //会报错, 因为只能传入: Policeman类获取它的父类型, 而Superman是Policeman的子类型, 所以不行.  }}

3. 协变、逆变、非变

在Spark的源代码中大量使用到了协变、逆变、非变,学习该知识点对阅读spark源代码很有帮助。

如下图:

Java Scala泛型方法怎么使用

3.1 非变

语法格式

class Pair[T]{}

语法格式

class Pair[+T]

3.3 逆变

语法格式

class Pair[-T]

3.4 示例

需求

参考代码

//案例: 演示非变, 协变, 逆变.object ClassDemo06 {  //1. 定义一个Super类、以及一个Sub类继承自Super类  class Super               //父类  class Sub extends Super   //子类  //2. 使用协变、逆变、非变分别定义三个泛型类  class Temp1[T]            //非变  class Temp2[+T]           //协变  class Temp3[-T]           //逆变.  def main(args: Array[String]): Unit = {    //3. 分别创建泛型类来演示协变、逆变、非变    //演示非变.    val t1:Temp1[Sub] = new Temp1[Sub]    //val t2:Temp1[Super] = t1          //编译报错, 因为非变是: Super和Sub有父子类关系, 但是Temp1[Super] 和 Temp1[Sub]之间没有关系.    //演示协变    val t3:Temp2[Sub] = new Temp2[Sub]    val t4:Temp2[Super] = t3          //不报错, 因为协变是: Super和Sub有父子类关系, 所以Temp2[Super] 和 Temp2[Sub]之间也有父子关系.                                      //Temp2[Super]是父类型,   Temp2[Sub]是子类型.    //演示逆变    val t5:Temp3[Super]  = new Temp3[Super]    val t6:Temp3[Sub] = t5          //不报错, 因为逆变是:  Super和Sub有父子类关系, 所以Temp3[Super] 和 Temp3[Sub]之间也有子父关系.                                    //Temp3[Super]是子类型,   Temp3[Sub]是父类型.  }}

读到这里,这篇“Java Scala泛型方法怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯