上界与下界-- 视图界定--协变与逆变
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、协变与逆变
了解概念即可
概念:
协变:泛型变量的值可以是本身类型或者其子类型
逆变:泛型变量的值可以是本身类型或者其父类型
表示:
协变 +
逆变 -
上界与下界-- 视图界定--协变与逆变相关推荐
- 7.scala初识 柯里化、隐式参数、隐式转换、视图边界、上界、下界、协变、逆变
1.前言: 学过java我们都知道,java中的继承是对类的增强,java中的代理.装饰是对对象方法的增强.而在scala中,隐式转换和隐式参数是Scala中两个非常强大的功能,隐式的对类的方法进行增 ...
- Scala中协变(+)、逆变(-)、上界(:)、下界(:)简单介绍
对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合List[A]的子类型,那么就称为covariance(协变) , 如果 List[A]是 List[B ...
- Java 泛型的协变与逆变
协变.逆变.抗变 协变,逆变,抗变等概念是从数学中来的,在编程语言Java/Kotlin/C#中主要应用在泛型上.描述的是两个类型集合之间的继承关系. 第一个集合为:Animal.Dog , Dog ...
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变
本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...
- 泛型型协变逆变_Java泛型类型简介:协变和逆变
泛型型协变逆变 by Fabian Terh 由Fabian Terh Java泛型类型简介:协变和逆变 (An introduction to generic types in Java: cova ...
- C# 4.0中的协变和逆变(一)
在刚刚落下帷幕的PDC上,我们得到了很多振奋的消息,包括C# 4.0及VS2010等等.Anders Liu 已经 将C# 4.0 新特性白皮书翻译了 出来,那里面有非常详细的介绍. C#的发展是很快 ...
- .NET可变性解析(协变和逆变)
[一]何为可变性 可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性.逆变性.不可变性. 那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下. ...
- 深入理解 C# 协变和逆变【转】
msdn 解释如下: "协变"是指能够使用与原始指定的派生类型相比,派生程度更大的类型. "逆变"则是指能够使用派生程度更小的类型. 解释的很正确,大致就是这样 ...
- C#协变和逆变 - 译
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/covariance-contravariance/ ...
最新文章
- idea ctrl+shift+f快捷键失效
- Oracle Grid Control 11g for linux安装和配置指南
- netty系列之:netty中的ByteBuf详解
- java httpclient 关闭_【Java系列007】HttpClient调用:你考虑过关闭连接、并发了吗?...
- signal(SIGPIPE, SIG_IGN);
- Halcon 和 C# 联合编程 - 如何使用开源项目 ViewROI
- 教你打通 Git 任督二脉
- Java异常的正确使用姿势
- 自助bi工具如何搭建数据可视化
- mysql创建备份文件,MySQL定时备份操作
- 南邮计算机考研复试经验,我的一点建议——南京邮电大学考研经验_跨考网
- 网络 | OSI七层模型各层常见协议
- FaShop-开源拖拽式小程序搭建平台
- centos8同步时间安装时间校准服务
- java 使用POI 导出 Excel 画斜线
- 搭建超级实用的免费机器翻译api
- ubuntu 出现device not managed,解决方法
- 简历制作课——如何写简历?
- Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码
- HZ视频配音配字幕工具v1.0配音配字幕、影视视频讲解利器
热门文章
- 使用XML作为数据库
- 宏正自动科技推出首款触摸屏LCD KVM多电脑切换器
- 小小突击队服务器维护多久,《小小突击队》08月06日更新公告
- Windows AMD 安装 PyTorch
- 纯前端导出excel文件(包含设置样式)
- NVMe Protect Information
- 微信读书中总显示服务器错误,微信读书充值遇到问题怎么办 微信读书充值遇到问题解决方法...
- 计算机界面一直闪,电脑光标一直闪烁怎么办?Win7左上角白杠一直闪解决方法...
- Django models常用Field介绍以及常见错误解决
- 桌面上的计算机图片怎么复制,怎么把一张普通的图片复制到EXCEL表格中