1、上界与下界:Upper bound,lower bound
        
        作用:规定泛型的取值范围
        
        Int x 
                100  <= x <= 200
                下界        上界
                
        (*)规定泛型的取值范围
            举例:定义一个泛型:T
                类的继承关系   A---->B----->C----->D  箭头指向子类
                可以规定T的取值范围    D  <:  T   <:  B
                T 的取值范围只能是 B C D
                
                <:  就是上下界表示方法
                
        (*)定义:
            上界  s <: T 规定了S的类型必须是T的子类或本身
            下界  u >: T 规定了U的类型必须是T的父类或本身
            
        scala> def addTwoString[T<:String](x:T,y:T) = x + " **** " + y
        addTwoString: [T <: String](x: T, y: T)String

scala> addTwoString("Hello","123")
        res9: String = Hello **** 123

scala> addTwoString(1,2)
        <console>:14: error: inferred type arguments [Int] do not conform to method addTwoString's type parameter bounds [T <: String]
               addTwoString(1,2)
               ^
        <console>:14: error: type mismatch;
         found   : Int(1)
         required: T
               addTwoString(1,2)
                            ^
        <console>:14: error: type mismatch;
         found   : Int(2)
         required: T
               addTwoString(1,2)
               
        报错原因:Int不是String类型。
        
        解决:1和2转换成字符串再调用
        scala> addTwoString(1.toString,2.toString)
        res11: String = 1 **** 2
        
        另外:可以使用 视图界定 来解决这个问题。
        
    2、视图界定:View bound
    
        是上界和下界的一种扩展
        
        除了可以接收上界和下界规定的类型之外,还可以接收能够通过隐式转换过去的类型
        
        用法 : %
        def addTwoString[T<%String](x:T,y:T) = x + " **** " + y
        含义:
        1、可以接收String及其子类
        2、可以接收能够转换成String的其他类型
        
        scala> def addTwoString[T<%String](x:T,y:T) = x + " **** " + y
        addTwoString: [T](x: T, y: T)(implicit evidence$1: T => String)String

scala> addTwoString(1,2)
        <console>:14: error: No implicit view available from Int => String.
               addTwoString(1,2)
               
        报错解决:定义隐式转换函数,把int转换成String
    
        scala> implicit def int2String(n:Int):String=n.toString
        warning: there was one feature warning; re-run with -feature for details
        int2String: (n: Int)String

scala> addTwoString(1,2)
        res13: String = 1 **** 2
        
        分析执行过程:
        1、调用 int2String 方法,把Int转换成String(scala在后台调用,不需要显示调用)
        2、调用addTwoString方法,拼接字符串
        
        隐式转换函数,不需要显示调用它,它就能被调用。
        
        scala> implicit def int2String2(n:Int):String="hehe"
        warning: there was one feature warning; re-run with -feature for details
        int2String2: (n: Int)String

scala> addTwoString(1,2)
        <console>:16: error: ambiguous implicit values:
         both method int2String of type (n: Int)String
         and method int2String2 of type (n: Int)String
         match expected type Int => String
               addTwoString(1,2)
    
    3、协变与逆变
        了解概念即可
        
        概念:
        协变:泛型变量的值可以是本身类型或者其子类型
        逆变:泛型变量的值可以是本身类型或者其父类型
        
        表示:
        协变 +
        逆变 -

上界与下界-- 视图界定--协变与逆变相关推荐

  1. 7.scala初识 柯里化、隐式参数、隐式转换、视图边界、上界、下界、协变、逆变

    1.前言: 学过java我们都知道,java中的继承是对类的增强,java中的代理.装饰是对对象方法的增强.而在scala中,隐式转换和隐式参数是Scala中两个非常强大的功能,隐式的对类的方法进行增 ...

  2. Scala中协变(+)、逆变(-)、上界(:)、下界(:)简单介绍

    对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合List[A]的子类型,那么就称为covariance(协变) , 如果 List[A]是 List[B ...

  3. Java 泛型的协变与逆变

    协变.逆变.抗变 协变,逆变,抗变等概念是从数学中来的,在编程语言Java/Kotlin/C#中主要应用在泛型上.描述的是两个类型集合之间的继承关系. 第一个集合为:Animal.Dog , Dog ...

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

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

  5. 泛型型协变逆变_Java泛型类型简介:协变和逆变

    泛型型协变逆变 by Fabian Terh 由Fabian Terh Java泛型类型简介:协变和逆变 (An introduction to generic types in Java: cova ...

  6. C# 4.0中的协变和逆变(一)

    在刚刚落下帷幕的PDC上,我们得到了很多振奋的消息,包括C# 4.0及VS2010等等.Anders Liu 已经 将C# 4.0 新特性白皮书翻译了 出来,那里面有非常详细的介绍. C#的发展是很快 ...

  7. .NET可变性解析(协变和逆变)

    [一]何为可变性 可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性.逆变性.不可变性. 那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下. ...

  8. 深入理解 C# 协变和逆变【转】

    msdn 解释如下: "协变"是指能够使用与原始指定的派生类型相比,派生程度更大的类型. "逆变"则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样 ...

  9. C#协变和逆变 - 译

    https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/covariance-contravariance/ ...

最新文章

  1. idea ctrl+shift+f快捷键失效
  2. Oracle Grid Control 11g for linux安装和配置指南
  3. netty系列之:netty中的ByteBuf详解
  4. java httpclient 关闭_【Java系列007】HttpClient调用:你考虑过关闭连接、并发了吗?...
  5. signal(SIGPIPE, SIG_IGN);
  6. Halcon 和 C# 联合编程 - 如何使用开源项目 ViewROI
  7. 教你打通 Git 任督二脉
  8. Java异常的正确使用姿势
  9. 自助bi工具如何搭建数据可视化
  10. mysql创建备份文件,MySQL定时备份操作
  11. 南邮计算机考研复试经验,我的一点建议——南京邮电大学考研经验_跨考网
  12. 网络 | OSI七层模型各层常见协议
  13. FaShop-开源拖拽式小程序搭建平台
  14. centos8同步时间安装时间校准服务
  15. java 使用POI 导出 Excel 画斜线
  16. 搭建超级实用的免费机器翻译api
  17. ubuntu 出现device not managed,解决方法
  18. 简历制作课——如何写简历?
  19. Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码
  20. HZ视频配音配字幕工具v1.0配音配字幕、影视视频讲解利器

热门文章

  1. 使用XML作为数据库
  2. 宏正自动科技推出首款触摸屏LCD KVM多电脑切换器
  3. 小小突击队服务器维护多久,《小小突击队》08月06日更新公告
  4. Windows AMD 安装 PyTorch
  5. 纯前端导出excel文件(包含设置样式)
  6. NVMe Protect Information
  7. 微信读书中总显示服务器错误,微信读书充值遇到问题怎么办 微信读书充值遇到问题解决方法...
  8. 计算机界面一直闪,电脑光标一直闪烁怎么办?Win7左上角白杠一直闪解决方法...
  9. Django models常用Field介绍以及常见错误解决
  10. 桌面上的计算机图片怎么复制,怎么把一张普通的图片复制到EXCEL表格中