当前位置:网站首页>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)
边栏推荐
- “蔚来杯“2022牛客暑期多校训练营1 (部分题目总结)
- 智能商务的数据分析平台设计与实现
- 文本攻击方法开源代码汇总
- Part I sourcetree installation
- 成功解决:error: src refspec master does not match any
- 局域网SDN技术硬核内幕 4 从计算虚拟化到网络虚拟化
- 002_Kubernetes安装配置
- Stm32cubeide link script explanation
- 如何保护 JDBC 应用程序免受 SQL 注入
- Leetcode 757 set the intersection size to at least 2[sort greedy] the leetcode path of heroding
猜你喜欢

Mysql无法访问,navicat提示:is not allowed to connect to this MySQL server

信息系统项目管理师必背核心考点(四十九)合同法

一次 MySQL 误操作导致的事故,「高可用」都顶不住了

Overview of multisensor fusion -- FOV and bev

微信小程序项目实战

Draw a wave ball with the curve of flutter and Bessel

Flutter memory leak detection

Information system project managers must recite the core examination points (49) contract law
![[ssm] unified result encapsulation](/img/ff/9528a062d464acee52047598af40c3.png)
[ssm] unified result encapsulation

我为OpenHarmony 写代码,战“码”先锋第二期正式开启!
随机推荐
Application of the latest version of Ontrack easyrecovery computer data recovery software
Uniapp switches the tab bar to display different pages, remembers the page location and pulls up to get new data
NB-IOT的四大特性
Basic commands of redis' five basic data types
局域网SDN硬核技术内幕 17 从一到百
局域网SDN技术硬核内幕 7 从二层到大二层
Understanding service governance in distributed development
【刷题记录】18. 四数之和
Here comes the genuine Adobe software! Adobe's only genuine family bucket subscription in the world costs only 0 yuan / year
Delete the duplicate items in the array (keep the last duplicate elements and ensure the original order of the array)
Utools recommendation
Z-Wave 800:SE 固件升级
局域网SDN硬核技术内幕 21 亢龙有悔——规格与限制(中)
Copytexture, copytoresolvetarget of UE4 engine
Is cross modal semantic alignment optimal under comparative learning--- Adaptive sparse attention alignment mechanism IEEE trans MultiMedia
Stm32cubeide link script explanation
关于Redis,是先更新数据库,还是先更新缓存?
我是如何在一周内拿到4份offer的?
Excel displays the link URL of the picture as picture to
【09】程序装载:“640K内存”真的不够用么?