scala学习七:scala的高级特性
2016-06-18 23:26
381 查看
scala学习七:scala的高级特性
标签(空格分隔): scala一,泛型类
类和特质可以带类型参数,使用[]来定义类型参数//T:泛型类的类型 class GenericClass[T]{ private var content:T=_ def set(value:T) ={content=value} def get():T={content} } //test object GenericClass{ def main(args:Array[String]){ val gen1=new GenericClass[Int] gen1.set(100) println(gen1.get()) val gen2=new GenericClass[String] gen2.set("name") println(gen2.get()) } }
二,泛型函数
函数和方法也可以带类型参数,把类型参数放在方法名后面。//ClassTag:上下文的运行状态 def mkArray[T:ClassTag](elem:T*) = Array[T](elem:*) mkArray(1,2,3) mkArray("tom","mike","lily ")
三,类型的上界和下界
class Vichael{ def drive() = println("vichael*************") } class Car extends Vichael{ override def drive() = println("car*************") } class Bicycle extends Vichael{ override def drive() = println("bicycle*************") } object test{ def takeVichael[T <:Car](v:T) = { v.drive() } def main(args:Array[String]){ var c=new Car takeVichael(c) } }
四,视图界定
def addTwoString[T <% String](x:T,y:T) = {println(x+"************"+y)} implicit def int2String(n:Int):String = {n.toString} addTwoString(100,200)
五,协变和逆变
协变:泛型变量的值可以是本身或者其子类
class Animal{} class Bird extends Animal{} class Sparrow extends Bird{} class EatSomeThing[+T](t:T){} object Demo{ def main(args:Array[String]){ val c1:EatSomeThing[Bird] = new EatSomeThing[Bird](new Bird) val c2:EatSomeThing[Animal]=c1 } }
逆变:泛型变量的值可以是本身或者其父类
class Animal{} class Bird extends Animal{} class Sparrow extends Bird{} class EatSomeThing[-T](t:T){} object Demo{ def main(args:Array[String]){ val c1:EatSomeThing[Animal] = new EatSomeThing[Animal](new Animal) val c2:EatSomeThing[Bird]=c1 } }
六,隐式函数
class Fruit(name:String){ def getName():String = {name} } class Monkey(f:Fruit){ def say() = {println("monkey like " + f.getName())} } object Demo{ implicit def fruitToMonkey(f:Fruit):Monkey ={new Monkey(f)} def main(args:Array[String]){ var f:Fruit=new Fruit("apple") f.say() } }
七,隐式参数
def testparameter(implicit name:String) = { println("the value is " + name)} implicit val name="this is a implicit value" testparameter
//利用隐式参数完成隐式转换 def smaller[T](a:T,b:T)(implicit order:T => Ordered[T]) ={if(order(a)<b) a else b} smaller(100,12) smaller("hello","abcd")
八,隐式类
object Demo{ implicit class Cal(x:Int){ def add(a:Int):Int = {a+x} } def main(args:Array[String]){ println(1.add(2)) /* 隐式类执行的过程: 1,当1.add(2)时,scala的编译器不会立即报错,在当前域中查找,有没有implicit修饰的同时可以将Int作为参数的构造器,并且具有add方法的类,通过查找,找到了Cal 2,利用隐式类来执行add方法 */ } }
相关文章推荐
- 1004 Problem D
- Java的依赖注入(控制反转)
- Java的依赖注入(控制反转)
- Java的依赖注入(控制反转)
- web.xml 配置 contextConfigLocation
- JS DOM(文档对象模型)与BOM(浏览器对象模型)
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
- Exchange 2010 PS 之新建接收域和地址策略
- Linux 应用---make及makefile的编写
- android studio界面简单介绍
- Unity项目架构设计
- Oracle-序列
- HDFS没有当前路径的概念
- 接口内部的类
- 275. H-Index II
- Linux C 数据结构---链表(单向链表)
- dijkstra堆优化模板
- 五子棋比赛程序对战平台
- Linux C 中断言assert()使用简介
- 多线程修改同一个数据