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等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...
 
随机推荐
- JWT初识记录
			
因为前一段时间做了一个系统持续操作期间自动刷新token有效性的需求,然后就想着找一个空闲时间总结一下JWT,所以今天就简单的记录一下自己了解的内容. JWT是什么 JWT全称是JSON Web To ...
 - 记录一次spring与jdk版本不兼容的报错
			
由于公司项目是普通的web工程,没有用上maven,所以笔者在jdk1.8版本下运行项目报了这样的错误 [ERROR]: 2020-03-09 09:38:50 [org.springframewor ...
 - 【JavaWeb】Filter 过滤器
			
Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...
 - zabbix 监控tomcat
			
zabbix 监控tomcat server端rpm -ivh jdk-8u20-linux-x64.rpmvi /etc/profileJAVA_HOME=/usr/java/jdk1.8.0_20 ...
 - 检查Mysql主从状态
			
.检查MySQL主从同步状态 #!/bin/bash USER=bak PASSWD=123456 IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e show s ...
 - oracle 释放表空间到OS(resize)
			
1.查看表空间里面的对象 SELECT OWNER AS OWNER, SEGMENT_NAME AS SEGMENT_NAME, SEGMENT_TYPE AS SEGMENT_TYPE, SUM ...
 - fsutil比较有用的几个命令
			
Fsutil:fsinfo 主要由专业支持者使用.列出所有驱动器,查询驱动器类型,查询卷信息,查询特定的 卷信息或文件系统统计信息. 语法参数 drives 列出计算机中所有的驱动器. drivety ...
 - 2V升3V芯片,输入2V输出3V可达1A
			
PW5328B是一个恒定频率, 6引脚 SOT23电流模式升压转换器,用于小型低功耗应用. PW5328B的开关频率为 1.2MHz,允许使用微小的.低成本的电容器和电感器.内部软启动导致小涌流和延长 ...
 - 1.8V升3V芯片,1.8V升3.3V升压芯片方案
			
两节干电池由于耗电量电压会降低,无法长期稳定的输出3V或者3.3V供电,直接两节干电池会供电电压不稳,影响后面电路稳定.两节干电池的供电电压在1.8V-3.2V左右 1.8V升3V升压芯片方案, 如P ...
 - Sklearn 与 TensorFlow 机器学习实战—一个完整的机器学习项目
			
本章中,你会假装作为被一家地产公司刚刚雇佣的数据科学家,完整地学习一个案例项目.下面是主要步骤: 项目概述. 获取数据. 发现并可视化数据,发现规律. 为机器学习算法准备数据. 选择模型,进行训练. ...