目录

1.何为泛型

2.泛型类

3.泛型函数

4.上边界Bounds,下边界Bounds

5.View Bounds 限定类

6.Context Bounds

7.Manifest Context Bounds

8.scala中的 协变,逆变

9.Existential Type


1.何为泛型

定义:“参数化类型”
顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,
此时类型也定义成参数形式(可以称之为类型形参)
然后在使用/调用时传入具体的类型(类型实参)。

作用:
限定(类,函数)中 参数类型,实现程序更好的健壮性

例子:
List a = new ArrayList[Integer]()
List a = new ArrayList()
a.add(1)
a.add("2")
判断:a.get(1) == 2  ,不加限定,那么就会报错

2.泛型类

含义:类的声明中,定义一些泛型类型,然后在类内部
比如field或者method,就可以使用这些泛型类型

作用:让使用了T定义的 field,method,类型保持一致

特点:自动推断类型的能力
      在创建类时,不用主动限定T,会依据你传入的参数进行判断

结构:
class Student[T](val v:T){}
var student = new Student[T](T);

例子:
class Student[T,V](val localId: T,val localId2:V) {
  def getSchoolId(hukouId: T,hukouId2:V) = "S-" + hukouId + "-" + hukouId2+"-"localId+"-"+localId2
}

val leo = new Student[Int,String](111,"222")
leo.getSchoolId(222,"222")

3.泛型函数

含义:泛型类一样,在scala中同属于一等公民
结构:
  def getCard[T](v:T)={}

例子:
def getCard[T](content: T) = {
  if(content.isInstanceOf[Int]) "card: 001, " + content
  else if(content.isInstanceOf[String]) "card: this is your card, " + content
  else "card: " + content
}

getCard[String]("hello world")

4.上边界Bounds,下边界Bounds

含义:
(1)边界:限定于有父子关系的两个类
(2)上,下:限定于 该类型,或者该类型的子类,或者父类(包含关系)

适用范围:限定方法,限定类均可
    
例子:在派对上交朋友
class Person(val name: String) {
  def sayHello = println("Hello, I'm " + name)
  def makeFriends(p: Person) {
    sayHello
    p.sayHello
  }
}
class Student(name: String) extends Person(name)
class Party[T <: Person](p1: T, p2: T) {
  def play = p1.makeFriends(p2)
}

def getCard[T<:Person](content: T,content2:T) = {
    println(content.makeFriends(content2))
}

例子:领身份证
class Father(val name: String) 
class Child(name: String) extends Father(name)

def getIDCard[R >: Child](person: R) {
  if (person.getClass == classOf[Child]) println("please tell us your parents' names.")
  else if (person.getClass == classOf[Father]) println("sign your name for your child's id card.")
  else println("sorry, you are not allowed to get id card.")
}

5.View Bounds 限定类

含义: 相当于父子类的加强版
(1)支持有父子关系的多种类型
(2)支持“被隐式转换后”的类型判断

结构: 
    class Party[T <% Person](p1: T, p2: T)
比较:冒号“:” 替换为 百分号 “%”

例子:跟小狗交朋友
class Person(val name: String) {
  def sayHello = println("Hello, I'm " + name)
  def makeFriends(p: Person) {
    sayHello
    p.sayHello
  }
}
class Student(name: String) extends Person(name)
class Dog(val name: String) { def sayHello = println("Wang, Wang, I'm " + name) }

implicit def dog2person(dog: Object): Person = if(dog.isInstanceOf[Dog]) {val _dog = dog.asInstanceOf[Dog]; new Person(_dog.name) } else Nil

class Party[T <% Person](p1: T, p2: T) {
  def play = p1.makeFriends(p2)
}

var leo = new Student("leo")
var dog = new Dog("wangcai")
var party = new Party(leo,dog)
party.play
执行结果比较慢

6.Context Bounds

含义: scala使用到上下文中的隐式值以及注入
特点:更加接洽与scala内置类的应用于比较

结构:
class Calculator[T: Ordering] (val number1: T, val number2: T) {
  def max(implicit order: Ordering[T]) = 方法块儿(order.compare(number,number2))
}

例子: 
class Calculator[T: Ordering] (val number1: T, val number2: T) {
  def max(implicit order: Ordering[T]) = if(order.compare(number1, number2) > 0) number1 else number2
}
var cal = new Calculator(1,24)
cal.max // 即可比较大小

7.Manifest Context Bounds

含义:实例化一个泛型数组,就必须使用Manifest Context Bounds
特点:针对于数组,集合而言(前面是针对单个对象)

例子:
class Meat(val name: String)
class Vegetable(val name: String)

def packageFood[T: Manifest] (food: T*) = {
  val foodPackage = new Array[T](food.length)
  for(i <- 0 until food.length) foodPackage(i) = food(i)
  foodPackage 
}

val v1 = new Vegetable("tudou")
val v2 = new Vegetable("doufu")

val packageFood = packageFood(v1,v2)

8.scala中的 协变,逆变

含义:scala依据对象中传递的参数来协从的判断对象之间的从属关系
例子:Java中,如果有Professional是Master的子类,那么Card[Professionnal]是不是Card[Master]的子类
特点:更加灵活,直接用父子类,来对别的类的对象们进行了上下关系的区分

结构:
   class Card[+T]()
   class Card[-T]()
+ 表示T和T的子类
- 表示T和T的父类   
 
例子: 
class Master
class Professional extends Master

// 大师以及大师级别以下的名片都可以进入会场
class Card[+T] (val name: String)

def enterMeet(card: Card[Master]) {
  println("welcome to have this meeting!")
}

val card1 = new Card[Master]("Tom")
val card2 = new Card[Professional]("Leo")
enterMeet(card1)  OK
enterMeet(card2)  OK

例子2:
class Master
class Professional extends Master

class Card[-T] (val name: String)
def enterMeet(card: Card[Master]) {
  println("welcome to have this meeting!")
}

val card1 = new Card[Master]("Tom")
val card2 = new Card[Professional]("Leo")
enterMeet(card1)  OK
enterMeet(card2)  No

9.Existential Type

特点:特殊的类型占位符,表示在声明时,必须限定某一个类型

例子:
Array[_] = Array[T] forSome { type T }

scala之类型参数相关推荐

  1. 【Scala】Scala中的模式匹配、类型参数与隐式转换

    1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...

  2. Scala模式匹配和类型系统

    Scala模式匹配和类型系统 1.模式匹配比java中的switch case强大很多,除了值,类型,集合等进行匹配,最常见的Case class进行匹配,Master.scala有大量的模式匹配. ...

  3. Scala 函数式编程

    一 函数式编程 1.1将函数值赋给变量 >>Scala中函数可以独立存在,不必像Java一样,还需要依附于类.而且我们可以直接将函数作为值赋给变量 >>Scala语法规定,将函 ...

  4. Scala基础(四)

    一.模式匹配 1.了解 模式匹配是Scala中非常有特色,非常强大的一种功能.类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理. 但是Scala的 ...

  5. Scala-Scala学习笔记

    目录: 概述 1 Scala基础 1 1.1 数据类型 1 1.2 数据类型结构图 2 1.3 变量 3 1.4 懒值 3 1.5 操作符 4 1.6 option类型 4 1.7 块表达式与赋值 4 ...

  6. Flink自定义函数

    文章目录 01 引言 02 如何注册自定义函数? 03 自定义函数分类 3.1 Scalar Function 3.1.1 Scalar Function如何实现? 3.1.2 Scalar Func ...

  7. Scala入门到精通——第二十一节 类型参数(三)-协变与逆变

    本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...

  8. Scala入门到精通——第二十节 类型参数(二)

    本节主要内容 Ordering与Ordered特质 上下文界定(Context Bound) 多重界定 类型约束 1. Ordering与Ordered特质 在介绍上下文界定之前,我们对Scala中的 ...

  9. Scala入门到精通——第十七节 类型参数(一)

    本节主要内容 类型变量界定(Type Variable Bound) 视图界定(View Bound) 上界(Upper Bound)与下界(Lower Bound) 1. 类型变量界定(Type V ...

最新文章

  1. 【整理】电容知识小结(二)
  2. php上传图片类型代码,php 上传图片的代码
  3. pug模板引擎——jade
  4. PostgreSQL Oracle 兼容性之 - rownum
  5. 抖音客新版UI短视频点赞任务系统完美运营级别[等级功能+信誉积分+保证金]
  6. 通过脚本设置Windows系统ip地址
  7. C# 实现 Hyper-V 虚拟机 管理
  8. SourceTree windows版本免注册免登陆使用方法
  9. java 阻塞队列介绍
  10. maven install 安装项目问题总结An unknown compilation problem occurred
  11. JQuery Mobile - 固定住页面和页脚
  12. Python基于opencv调用摄像头获取个人图片
  13. 临时表空间和数据表空间
  14. 缺失.NET Framework组件的解决方法
  15. 三菱f800变频器 频率设定_三菱F800变频器调试参数总结.doc
  16. python组合数据类型分类_《Python程序设计与案例教程》课件chap6组合数据类型.ppt...
  17. 操作系统笔记(一)——操作系统的定义及作用
  18. “远香烟·近健康”乡风文明之禁烟活动
  19. 道可云元宇宙每日资讯|济南发布促进元宇宙产业创新发展行动计划
  20. 程序员要被革命了,微软推出自己会编程的“AI 程序员”插件

热门文章

  1. iptables限制Docker IP和端口访问
  2. Java温故而知新-程序逻辑结构
  3. 用jmeter压测tcp
  4. mysql日志分析工具之mysqlsla
  5. C语言:数组奇偶排序,奇数从小到大,偶数从大到小;输出
  6. 跟我一起做一个vue的小项目(九)
  7. 阿里easyexcel通过模板导出excel
  8. 暗刷流量,刷点击,手机访问的一些小见解
  9. 打造新老员工双赢机制变对立为统一
  10. Python Casadi 基本语法记录