Scala类型参数(泛型)与隐式转换
package com.yz9
import org.junit.Test
import scala.collection.mutable.ListBuffer
class test {
@Test
def test1(): Unit ={
val abc = new Abc[String,Int]("小明",20)
println(abc.name)
println(abc.age)
}
@Test
def test2(): Unit ={
val list = ListBuffer[String]()
list.append("小","大")
for(s<- list){
println(s)
}
}
@Test
def test3(): Unit ={
//在函数上使用泛型
def show[T,S,J](a:T,b:S)=println(s"$a------$b")
show("小白",333)
}
@Test
def test4(): Unit ={
val st = new student[Int](1,66)
println(st.bigger) //Int不行 加上隐士转换可以
val st2 = new student[String]("a","b")
println(st2.bigger)//行
val st3 = new student[Long](3,55)
println(st3.bigger)//Long不行 加上隐士转换可以
val st4 = new student[Integer](5,66)
println(st4.bigger)//Integer(Java类型)可以
}
@Test
def test5(): Unit ={
//scala本身不支持泛型 协变和逆变
//要想使用 协变 (java向上转型) 泛型前写+
// 逆变 (java向下转型) 泛型前写-
//val list1:MyList[Person]=new MyList[St]//协变ok
//val list2:MyList[St]=new MyList[Person]//逆变编译就报错
val list3:YouList[St]=new YouList[Person]//逆变ok
// val list4:YouList[Person]=new YouList[St]//协变编译报错
}
@Test
def tset6(): Unit ={
//类型通配符
//定义一个方法
def show(p:Pair[_<:Person]): Unit ={
println("ok")
}
//调用
show(new Pair[Person](new St,new Tc))
}
}
class Pair[T](first:T,second:T){
println("运行成功")
}
class Person
class St extends Person
class Tc extends Person
class MyList[+T]//支持协变
class YouList[-T]//支持逆变
//给T一个上限 T<:类型 Int和Long不行
// T<% 类型 %可以促使隐士转换 例如Int-》RichInt
//Comparable的子类一定有compareTo方法
class student[T <%Comparable[T]](first:T,second:T){
//"".compareTo()字符串有该方法
//66.compareTo(77)long有该方法
//取出大值
def bigger= if (first.compareTo(second)>0) first else second
}
case class Abc[T,S](name:T,age:S)//T和S只是类型的占位,使用时再指定
package com.yz9
import java.io.File
import org.junit.Test
import scala.io.Source
class test2 {
@Test
def test1(): Unit ={
//val x:Int=3.5 报错
//定义一个隐士转换函数
implicit def double2int(num:Double):Int=num.toInt
val a:Int=3.3//隐式(看不出来)转换
println(a)//3
}
@Test
def test2(): Unit ={
//定义一个读文件方法
implicit def file2myFile(file: File):MyFile =new MyFile(file)
//使用file调用MyFile的方法,依赖了隐士转换[相当于为file对象增加了一个方法,丰富了类库api]
new File("C:\\Users\\a\\Desktop\\abc.txt").read()
//做隐士转换函数时注意:
//1 有一个单个参数(需要转谁把谁当参数)
//2 返回值就是需要转型的目标类型
}
//定义一个class
class MyFile(file: File){
def read()= println(Source.fromFile(file).getLines().mkString)
}
}
package com.yz9
import java.io.File
import scala.io.Source
object MyImplicitFunction {
//要集中放在object里,不然引用时找不到
//定义隐式函数
implicit def show(x:Double)=x.toInt
//定义一个读文件方法
implicit def file2myFile(file: File):MyFile =new MyFile(file)
//定义一个class
class MyFile(file: File){
def read()= println(Source.fromFile(file).getLines().mkString)
}
//隐式值
implicit val a:Int=999
implicit def string2int(x:String): Int =x.toInt
}
package com.yz9
import java.io.File
import org.junit.Test
class test3 {
@Test
def test1(): Unit ={
import com.yz9.MyImplicitFunction._//引用
val a:Int=33.3//有隐士转换,所有的double都能当作int来用
new File("C:\\Users\\a\\Desktop\\abc.txt").read()
}
@Test
def test2(): Unit ={
import com.yz9.MyImplicitFunction._
//隐士参数 会被隐式值自动赋值
def show(name:String)(implicit age:Int): Unit ={
println(s"$name----$age")
}
show("张三")
val x:Int="33"
}
}
Scala类型参数(泛型)与隐式转换的更多相关文章
- Scala学习二十一——隐式转换和隐式参数
一.本章要点 隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象.它们可以从当前作用域中以单个标识符定义的隐式对象的获取, ...
- 【Scala】什么是隐式转换?它又能用来干嘛?该怎么用
文章目录 定义 隐式参数 隐式转换 隐式值:给方法提供参数 隐式视图 将Int和Double类型转换为String 狗狗学技能(使用别的类中的方法) 使用规则 定义 隐式参数 隐式参数指在函数或者方法 ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
- 深入理解Scala的隐式转换系统
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- 转载:深入理解Scala的隐式转换系统
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- 深入理解Scala的隐式转换
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- scala的隐式转换
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- Scala入门到精通——第十九节 隐式转换与隐式參数(二)
作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...
- Scala入门系列(十二):隐式转换
引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...
随机推荐
- Spring Boot 2.0 的配置绑定类Bindable居然如此强大
1. 前言 在开发Spring Boot应用时会用到根据条件来向Spring IoC容器注入Bean.比如配置文件存在了某个配置属性才注入Bean : 图中红色的部分是说,只有ali.pay.v1.a ...
- JavaScript 内存详解 & 分析指南
前言 JavaScript 诞生于 1995 年,最初被设计用于网页内的表单验证. 这些年来 JavaScript 成长飞速,生态圈日益壮大,成为了最受程序员欢迎的开发语言之一.并且现在的 JavaS ...
- 【老孟Flutter】为什么 build 方法放在 State 中而不是在 StatefulWidget 中
老孟导读:此篇文章是生命周期相关文章的番外篇,在查看源码的过程中发现了这一有趣的问题,欢迎大家一起探讨. Flutter 中Stateful 组件的生命周期:http://laomengit.com/ ...
- python学习笔记 | 国内常用源镜像地址
各镜像列表 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 ...
- IDEA 常用的一些 (就几个) 快捷键
快捷键 说明 Ctrl + P 提示类参数 Ctrl + Q 提示类的属性和方法包名 Ctrl + D 复制一行到下一行 Ctrl + F 查找 Ctrl + R 替换 Ctrl + Z 撤销 Ctr ...
- kubernets集群的安全防护(上)
一 了解认证机制 1.1 API的服务器在接收来自客户端的请求的时候会对发起的用户进行几个步骤 认证插件进行认证,确认发起的用户是外部用户,还是集群中的某个命名空间里面的pod 确认用户属于哪个 ...
- 镍氢可充电电池2.4V转3.3V,2V转3.3V稳压供电输出电路图
PW5100可以实现2.4V转3.3V,2V转3.3V的稳压电源电路,输出电流500MA.静态电流10uA,SOT23-5封装.输出纹波低,轻载性能高(轻载电感推荐6.8UH-10UH). PW510 ...
- Java多线程基础知识笔记(持续更新)
多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...
- SourceGenerator入门指北
SourceGenerator介绍 SourceGenerator于2020年4月29日在微软的.net blog首次介绍,大概说的是开发者编可以写分析器,在项目代码编译时,分析器分析项目既有的静态代 ...
- 阿里面试常问的redis数据结构,建议收藏
关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库.它支持包括String.List.Set.Zset.hash五种数据结构.除此之外,通过 ...