当前位置:网站首页>Scala学习——泛型[T]的6种使用
Scala学习——泛型[T]的6种使用
2022-07-22 21:23:00 【武念】
package com.dtspark.scala.basics
/**
* 1,scala的类和方法、函数都可以是泛型。
*
* 2,关于对类型边界的限定分为上边界和下边界(对类进行限制)
* 上边界:表达了泛型的类型必须是"某种类型"或某种类型的"子类",语法为“<:”,
* 下边界:表达了泛型的类型必须是"某种类型"或某种类型的"父类",语法为“>:”,
*
* 3, "<%" :view bounds可以进行某种神秘的转换,把你的类型在没有知觉的情况下转换成目标类型,
* 其实你可以认为view bounds是上下边界的加强和补充,语法为:"<%",要用到implicit进行隐式转换(见下面例子)
*
* 4,"T:classTag":相当于动态类型,你使用时传入什么类型就是什么类型,(spark的程序的编译和运行是区分了Driver和Executor的,只有在运行的时候才知道完整的类型信息)
* 语法为:"[T:ClassTag]"
*
* 5,逆变和协变:-T和+T(下面有具体例子)+T可以传入其子类和本身(与继承关系一至)-T可以传入其父类和本身(与继承的关系相反),
*
* 6,"T:Ordering" :表示将T变成Ordering[T],可以直接用其方法进行比大小,可完成排序等工作
*/
class Person(val name:String){
def talk(person:Person){
println(this.name+" speak to "+person.name)
}
}
class Worker(name:String)extends Person(name)
class Dog(val name:String)
//注意泛型用的是[]
class Club[T<:Person](p1:T,p2:T){
//"<:"必须是person或person的子类
def comminicate = p1.talk(p2)
}
class Club2[T<%Person](p1:T,p2:T){
def comminicate = p1.talk(p2)
}
class Engineer
class Expert extends Engineer
//如果是+T,指定类型为某类时,传入其子类或其本身
//如果是-T,指定类型为某类时,传入其父类或其本身
class Meeting[+T]//可以传入T或T的子类
class Maximum[T:Ordering](val x:T,val y:T){
def bigger(implicit ord:Ordering[T])={
if(ord.compare(x, y)>0)x else y
}
}
object HelloScalaTypeSystem {
def main(args: Array[String]): Unit = {
val p= new Person("Spark")
val w= new Worker("Scala")
new Club(p,w).comminicate
//"<%"的列子
//只是提供了一个转换的方法,在遇到<%时会调用看dog是否被转换了。
implicit def dog2Person(dog:Dog)=new Person(dog.name)
val d = new Dog("dahuang")
//注意必须强制类型转换,implicit中虽然是将dog隐式转换成person,
//但是其实是对象擦除,变成了object,所以还要强制类型转换成person后才能使用
//用[person]强制转换
new Club2[Person](p,d).comminicate
//-T +T例子,下面的participateMeeting方法指定具体是什么泛型
val p1=new Meeting[Engineer]
val p2=new Meeting[Expert]
participateMeeting(p1)
participateMeeting(p2)
// T:Ordering 的例子
println(new Maximum(3,5).bigger)
println(new Maximum("Scala","Java").bigger)
}
//这里指定传入的泛型具体是什么
def participateMeeting(meeting:Meeting[Engineer])= println("welcome")
}
T:ClassTag的例子
命令行代码:
scala> import scala.reflect.ClassTag
import scala.reflect.ClassTag
scala> def mkArray[T: ClassTag](elems: T*) = Array[T](elems: _*)
mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
scala> mkArray(1,2,3)
res1: Array[Int] = Array(1, 2, 3)
scala> mkArray("ss","dd")
res2: Array[String] = Array(ss, dd)
边栏推荐
- JS determines the scrolling element and solves the tab to switch the scrolling position independently
- Wechat campus second-hand book trading applet graduation design finished product (7) Interim inspection report
- Redis三种集群方案
- 局域网SDN技术硬核内幕 6 分布式任意播网关
- 成功解决:error: src refspec master does not match any
- Clever use of curl
- 【刷题记录】18. 四数之和
- NB-IOT的四大特性
- LAN SDN technology hard core insider 4 from computing virtualization to network virtualization
- 如何在 PHP 应用程序中预防SQL 注入
猜你喜欢
随机推荐
FTXUI基础笔记(hello world)
对比学习下的跨模态语义对齐是最优的吗?---自适应稀疏化注意力对齐机制 IEEE Trans. MultiMedia
《postgresql指南--内幕探索》第一章 数据库集簇、数据库和数据表
6-13漏洞利用-smtp暴力破解
局域网SDN硬核技术内幕 20 亢龙有悔——规格与限制(上)
Chapter 2 how to use sourcetree to update code locally
JS determines the scrolling element and solves the tab to switch the scrolling position independently
Report on the progress of writing Chinese experiments by latex
延伸联接边界,扩展业务范围,全面迈向智能云网2.0时代
Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
船新 IDEA 2022.2 正式发布,新特性真香
【09】程序装载:“640K内存”真的不够用么?
浅谈性能优化:APP的启动流程分析与优化
ETL工具(数据同步)
ASP.Net Core创建MVC项目上传多个文件(流方式)
沃尔沃xc90的安全性如何?一起来看看吧
我是如何在一周内拿到4份offer的?
Application of the latest version of Ontrack easyrecovery computer data recovery software
如何在 PHP 应用程序中预防SQL 注入
Get to know layer in fluent for the first time









