Scala Type Parameters 1
类型参数
表现形式:在名称后面以方括号表示,
Array[T]何处使用
class 中,用于定义变量、入参、返回值
class Pair[T, S](val first: T, val second: S)
// scala 可自动推断具体的类型
val p = new Pair(42, "String") // Pair[Int, String]
函数、方法
def getMiddle[T](a: Array[T]) = a(a.length / 2)
类型边界
上边界
T <: UpperBound// 比较大小
class Pair[T](val first: T, val second: T) {
def smaller = if (first.compareTo(second) < 0) first else second
}
无法确定 first 是否存在
compareTo方法,所以必须添加约束,fist 必须是Comparable的子类型,即需要添加上边界class Pair[T <: Comparable[T]](val first: T, val second: T) {
def smaller = if (first.compareTo(second) < 0) first else second
}
下边界
T >: LowerBound// 替换第一个元素
class Pair[T](val first: T, val second: T) {
def replaceFirst(newFirst: T) = new Pair[T](newFirst, second)
}
替换第一个元素为 T 的父类 R,那么返回类型是什么? 如果需要返回 R,则需要添加约束,即需要下边界;否则返回的类型为 Any
// 返回类型自动推断为 new Pair[R]
def replaceFirst[R >: T](newFirst: R) = new Pair(newFirst, second)
上下文边界
T : ContextBoundScala 2.8 对
Array进行了更新优化,使用隐式转换和 manifest 将数组整合为 Scala 的集合库def tabulate[T](len: Int, f: Int => T)(implicitm: ClassManifest[T]) = {
val xs = new Array[T](len)
for(i <- 0 until len) xs(i) = f(i)
xs
} // 简化后
def tabulate[T: ClassManifest](len: Int, f: Int => T) = {
val xs = new Array[T](len)
for(i <- 0 until len) xs(i) = f(i)
xs
}
ClassTag, 指定运行时的类型,如Array[Int]在运行时想指定为 int[]import scala.reflect._
def makePair[T : ClassTag](first: T, second: T) = {
val r = new Array[T](2); r(0) = first; r(1) = second; r
} makePair(4, 9) // 实际调用
makePair(4, 9)(classTag) // new 操作,即 ClassTag[Int] 构建原始类型数组 int[2]
classTag.newArray
多个边界
- 可同时添加上界和下界
T >: Lower <: Upper - 不可添加多个上界或多个下届,但可实现多个
trait,T <: Comparable[T] with Serializable with Cloneable
- 可指定多个上下文边界
T : Ordering : ClassTag
- 可同时添加上界和下界
类型约束
- 测试是否相等
T =:= U - 测试是否为子类
T <:< U - 测试是否可转换
T => U
要添加该约束,需添加隐式参数
// 约束类
class Pair[T](val first: T, val second: T)(implicit ev: T <:< Comparable[T]) // 约束方法调用,只有类型满足才能调用成功,否则报错
class Pair[T](val first: T, val second: T) {
def smaller(implicit ev: T <:< Ordered[T]) =
if (first < second) first else second
} // 便于类型推断
def firstLast[A, C <: Iterable[A]](it: C) = (it.head, it.last)
// 无法推断类型 A
firstLast(List(1, 2, 3)) // [Nothing, List[Int]]
// 添加约束关系
def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last)
- 测试是否相等
Scala Type Parameters 1的更多相关文章
- Scala Type Parameters 2
类型关系 Scala 支持在泛型类上使用型变注释,用来表示复杂类型.组合类型的子类型关系间的相关性 协变 +T,变化方向相同,通常用在生产 假设 A extends T, 对于 Clazz[+T],则 ...
- Beginning Scala study note(8) Scala Type System
1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...
- type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object
今天在进行代码检查的时候出现下面的异常: type parameters of <T>T cannot be determined; no unique maximal instance ...
- Java Error : type parameters of <T>T cannot be determined during Maven Install
遇到了一个问题如下: Caused by the combination of generics and autoboxing. 这是由于泛型和自动装箱联合使用引起的. 可以查看以下两个回答: 1 ...
- learning scala type alise
How to use type alias to name a Tuple2 pair into a domain type called CartItem type CartItem[Donut, ...
- learning scala repreated parameters
- Scala 深入浅出实战经典 第78讲:Type与Class实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- scala类型系统 type关键字
和c里的type有点像. scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala> t ...
- Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...
随机推荐
- [转]C++ 堆栈溢出的原因以及可行的解决方法
栈溢出(stackoverflow)的原因及解决办法 大家都知道,Windows程序的内存机制大概是这样的:全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出: 函数地 ...
- Guava工具类学习
目录 一.介绍 二.Optional类 1.定义 2.java8自带Optional 3.使用 三.Preconditions类 1.定义 2.使用 四.Ordering类 1.定义 2.使用 五.R ...
- Android源码分析(九)-----如何修改Android系统默认时间
一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...
- SQL Server 修改表结构(转载)
SQL Server 修改表结构 本文链接:https://blog.csdn.net/petezh/article/details/81744374 查看指定表结构 exec sp_help Rep ...
- PO设计模式
BasePage类: 在PO模式中抽象封装成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性. 基础页面类中包含公用方法:点击.输入.获取元素等 Page: 每个页面封装为 ...
- AIX系统逻辑卷管理
前言: 前期项目需要部署多套AIX环境下RAC集群,之前很少接触AIX系统,上来被创建逻辑卷等基本命令打脸了,其实网上搜下资料很多,总结一下,也是方便自己日后查阅. 创建逻辑卷 1.查看所有磁盘设备 ...
- stdin,stdout 和 STDOUT_FILENO,STDIN_FILENO
stdin,stdout 等类型为 FILE *. STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO 等类型为 int. 使用 FILE * 的函数主要有:fopen. ...
- centos自动同步服务器时间
原文:https://my.oschina.net/yysue/blog/1628733 1.安装ntpdate yum install ntpdate -y 2.测试是否正常 ntpdate cn. ...
- clickjacking 攻击
文章:Web安全之点击劫持(ClickJacking) 点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户 ...
- qt 断点无效
点击 工具 -->选项-->构建套件-->手动设置项,选择正确的编译器和调试器.