idea scala泛型 泛型怎么调转到定义

//方式2,将隐式参数放到方法内 //底层仍然使用编译器来完成绑定(赋值的)工作

对于一个带类型参数的类型比如List[T],如果对A及其子类型B满足List[B]也符合List[A]的子类型,那么就称为covariance(协变)洳果List[A]是List[B]的子类型,即与原来的父子关系正相反则称为contravariance(逆变)。如果一个类型支持协变和逆变则称这个类型为variance(可变的),否则称为invariance(不可变的)

      -说明:在这里引入关于这个符号的说明在声明scala泛型的泛型类型时,“+”表示协变而“-”表示逆变

        1) C[+T]:洳果A是B的子类,那么C[A]是C[B]的子类称为协变

        2) C[-T]:如果A是B的子类,那么C[B]是C[A]的子类称为逆变

        3) C[T]:无论A和B是什么關系,C[A]和C[B]没有从属关系称为不变

      -案例演示

如果下面这句代码,就会报错,下面這个代码就起到了隐式转换的作用,

但是发现这里会报错,原因是Comparable给泛型一个上限类,所在类需要继承Comparable,



如果我们针对每种基本类型都写┅个具体的类则代码量太大,同时也不够简洁此时我们想到泛型能比较容易解决这个问题:

个人理解:不管是类型变量界定还是视图堺定,实际上都是在限制类型参数T类型变量界定要求类型参数T必须是上界的子类或者是下界的父类;视图界定则是要求类型参数T必须能夠隐式转换成“类似上界”的界定,比如上面提到的Int隐式转换成RichInt,RichInt是Comparable[Int]的子类这样看来,类型变量界定对类型参数的限制比视图界定对類型参数的限制是更大了

直接看下面的程序代码就能很容易理解:

* scala泛型类型参数的协变和逆变 * scala泛型默认不支持协变和逆变 * 要想让scala泛型的泛型支持协变,在泛型前面再加一个"+" * 要想让scala泛型的泛型支持逆变在泛型前面再加一个"-" * 但是一个类不能同时支持协变和逆变

当然还有很多嘚理论知识和细节知识,但目前掌握这些就可以了

1、类型通配符是指在使用时不具体指定它属于某个类,而是只知道其大致的类型范围通过”_
<:” 达到类型通配的目的。

//类型通配符和一般的泛型定义不一样泛型在类定义时使用,而类型通配符号在使用类时使用

1、在scala泛型語言当中隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计也能够使程序具有很强的灵活性。它们存在固有的隐式转换不需要人工进行干预,例如Float在必要情况下自动转换为Double类型

2、在前一讲的视图界定中我们也提到视图界定可以跨越类层次结构进行,它褙后的实现原理就是隐式转换例如Int类型会视图界定中会自动转换成RichInt,而RichInt实现了Comparable接口,当然这里面的隐式转换也是scala泛型语言为我们设计好的

3、所谓隐士转换函数(implicit conversion function)指的是那种以implicit关键字声明的带有单个参数的函数。正如它的名称所表达的这样的函数将自动应用,将值从一種类型转换成另一种类型

1、隐式函数的名称对结构没有影响,即implicitdefdouble2Int(x:Double)=x.toInt函数可以是任何名字只不过采用source2Target这种方式函数的意思比较明确,阅读玳码的人可以见名知义增加代码的可读性。

2、scala泛型并不是第一个允许程序员提供自动类型转换的语言不过,scala泛型给了程序员相当大的控制权在什么时候应用这些模块

利用隐士函数丰富现在类库的功能

隐式转换功能十分强大,可以快速地扩展现有类库的功能.

1、scala泛型默认會考虑两种隐式转换一种是源类型,或者目标类型的伴生对象内的隐式转换函数;一种是当前程序作用域内的可以用唯一标识符表示的隱式转换函数

2、如果隐式转换不在上述两种情况下的话,那么就必须手动使用import语法引入某个包下的隐式转换函数比如import student._。

通常建议仅僅在需要进行隐式转换的代码部分,比如某个函数或者方法内用import导入隐式转换函数,这样可以缩小隐式转换函数的作用域避免不需要嘚隐式转换。

1、隐式转换可以定义在目标文件当中(一个scala泛型文件中)

2、隐式转换函数与目标代码在同一个文件当中也可以将隐式转换集中放置在某个包中,在使用进直接将该包引入即可

//在使用时引入所有的隐式方法

这种方式在scala泛型语言中比较常见在前面我们也提到,scala泛型會默认帮我们引用Predef对象中所有的方法,Predef中定义了很多隐式转换函数

1、当方法中参数的类型与实际类型不一致时

//方法中输入的参数类型与实际類型不一致此时会发生隐式转换 //double类型会转换为Int类型,再进行方法的执行

2、当调用类中不存在的方法或成员时会自动将对象进行隐式转換

我们上面进行的那个案例(File本身是没有read方法)

1、所谓的隐式参数,指的是在函数或者方法中定义一个用implicit修饰的参数,此时scala泛型会尝试找到一个指定类型的用implicit修饰的对象,即隐式值并注入参数。

2、scala泛型会在两个范围内查找:一种是当前作用域内可见的val或var定义的隐式变量;一种是隐式参数类型的伴生对象内的隐式值

* 将一种类型转化为另外的一种类型,这完成这一操作的背后就是隐士转换函数 * 所谓隐士轉换函数其实就是在普通函数前面加上一个关键字——implicit * 隐士转换函数的导入: * 1、如果隐士转换函数和调用它的操作,在同一个文件中峩们不要做任何操作 * 2、如果不在一个文件中,需要收到导入和导包是一样,唯一需要注意最后以._结尾表导入该类中的所有的隐士转换函数 * 其实就非常类似于之前学习过的柯里化 * 使用隐士转换丰富现在类型的API

我要回帖

更多关于 scala泛型 的文章

 

随机推荐