本节主要内容

  1. 泛型(Generic Type)简单介绍
  2. 注解(Annotation)简单介绍
  3. 注解经常使用场景

1. 泛型(Generic Type)简单介绍

泛型用于指定方法或类能够接受随意类型參数,參数在实际使用时才被确定,泛型能够有效地增强程序的适用性,使用泛型能够使得类或方法具有更强的通用性。泛型的典型应用场景是集合及集合中的方法參数,能够说同java一样,scala中泛型无处不在,详细能够查看scala的api

1 泛型类

//单个泛型參数的使用情况
class Person[T](var name:T) class Student[T](name:T) extends Person(name) object GenericDemo {
def main(args: Array[String]): Unit = {
println(new Student[String]("摇摆少年梦").name)
}
}

多个泛型參数的使用情况:

class Person[T](var name:T)

class Student[T,S](name:T,var age:S) extends Person(name)

object GenericDemo {
def main(args: Array[String]): Unit = {
println(new Student[String,Int]("摇摆少年梦",18).name)
}
}
D:\ScalaWorkspace\ScalaChapter16\bin\cn\scala\xtwy>javap -private Person.class
Compiled from "GenericDemo.scala"
public class cn.scala.xtwy.Person<T> {
private T name;
public T name();
public void name_$eq(T);
public cn.scala.xtwy.Person(T);
} D:\ScalaWorkspace\ScalaChapter16\bin\cn\scala\xtwy>javap -private Student.class
Compiled from "GenericDemo.scala"
public class cn.scala.xtwy.Student<T, S> extends cn.scala.xtwy.Person<T> {
private S age;
public S age();
public void age_$eq(S);
public cn.scala.xtwy.Student(T, S);
}

从上面的代码不难看出,scala泛型对应于java中的泛型,掌握了java中的泛型也就掌握了scala中的泛型

2. 注解(Annotation)简单介绍

Annotation是一种对程序代码进行描写叙述的结构化信息。

Annotation能够分布在程序的不论什么地方,能够注解变量、类、方法、參数等多种元素,它的主要功能有以下几种:

1 自己主动生成scala文档

scala.collection.immutable.HashMap类对应部分源代码:

/** This class implements immutable maps using a hash trie.
*
* '''Note:''' The builder of this hash map may return specialized representations for small maps.
*
* @tparam A the type of the keys contained in this hash map.
* @tparam B the type of the values associated with the keys.
*
* @author Martin Odersky
* @author Tiark Rompf
* @version 2.8
* @since 2.3
* @see [[http://docs.scala-lang.org/overviews/collections/concrete-immutable-collection-classes.html#hash_tries "Scala's Collection Library overview"]]
* section on `Hash Tries` for more information.
* @define Coll `immutable.HashMap`
* @define coll immutable hash map
* @define mayNotTerminateInf
* @define willNotTerminateInf
*/
@SerialVersionUID(2L)
class HashMap[A, +B] extends AbstractMap[A, B]
with Map[A, B]
with MapLike[A, B, HashMap[A, B]]
with Serializable
with CustomParallelizable[(A, B), ParHashMap[A, B]]
{

上述annotation生成的文档内容例如以下:

2 检查程序中可能出现的语法问题

//当程序使用该API时,给出对应提示,属于语法检查范畴
@deprecated("Use the `merged` method instead.", "2.10.0")
def merge[B1 >: B](that: HashMap[A, B1], mergef: MergeFunction[A, B1] = null): HashMap[A, B1] = merge0(that, 0, liftMerger(mergef))

3 规定程序行为

//@BeanProperty。要求程序生成对应getter,setter方法。与java命名规范一致
class Student[T,S](name:T,var age:S) extends Person(name)
{
@BeanProperty var studentNo:String=null
}

当然。annotation还有其他功能,上面三种仅仅是平时在编敲代码时最为经常使用的功能

annotation具有例如以下语法格式:

class A
class B extends A{
//同java一样。採用@+注解关键字对方法、变量
//类等进行注解标识
//以下的注解用于标识getName方法在未来会被丢弃
//不推荐使用
@deprecated def getName()="Class B"
} object AnnotationDemo{
def main(args: Array[String]): Unit = {
var b=new B()
//在调用的时候。编译器出给出对应提示
b.getName()
}
}

3. 注解经常使用场景

注解的经常使用场景包含volatile。transient。native,SerialVersionUID,serializable5个。用于对变量或方法进行注解,当中volatile用于标识变量可能会被多个线程同一时候改动,它不是线程安全的;transient用于标识变量是瞬时的,它不会被持久化;native用于标识算法来自C或C++代码实现



abstract class A
{
//native用于标记 cplusplusMethod为c或c++中实现的本地方法
@native def cplusplusMethod()
} //标记B可被序列化
//注解声明序列化版本号
@SerialVersionUID(1000330L)
@serializable
class B extends A{
//volatile注解标记变量name非线程安全
@volatile var name:String="B"
//transient注解用于标记变量age不被序列化
@transient var age:Int=40 }

以下举下对象序列化的样例:

//以下的代码编译时不会出问题,但运行时会抛出异常
class Person{
var name:String="zzh"
var age:Int=0
override def toString()="name="+name+" age="+age
} object Serialize {
def main(args: Array[String]): Unit = {
val file = new File("person.out") val oout = new ObjectOutputStream(new FileOutputStream(file))
val person = new Person
oout.writeObject(person)
oout.close() val oin = new ObjectInputStream(new FileInputStream(file))
val newPerson = oin.readObject()
oin.close();
println(newPerson)
}
} Exception in thread "main" java.io.NotSerializableException: cn.scala.xtwy.serialize.Person
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at cn.scala.xtwy.serialize.Serialize$.main(Serialize.scala:22)
at cn.scala.xtwy.serialize.Serialize.main(Serialize.scala)

此时在Person类前加@serializable则能够对对象进行正常序列化

//声明对象可序列化
@serializable
class Person{
var name:String="zzh"
var age:Int=0
override def toString()="name="+name+" age="+age
} object Serialize {
def main(args: Array[String]): Unit = {
val file = new File("person.out") val oout = new ObjectOutputStream(new FileOutputStream(file))
val person = new Person
oout.writeObject(person)
oout.close() val oin = new ObjectInputStream(new FileInputStream(file))
val newPerson = oin.readObject()
oin.close();
println(newPerson)
}
}
//反序列化后的输出结果为:
//name=zzh age=0

假设给成员变量加@transient注解的话。则对应的成员变量不会被序列化。此时假设进行反序列化的话,对应成员变量为null,如:

package cn.scala.xtwy.serialize

import java.io.File
import java.io.ObjectOutputStream
import java.io.FileOutputStream
import java.io.ObjectInputStream
import java.io.FileInputStream @serializable
class Person{
//@transient注解声明后。成员变量不会被充列化
@transient var name:String="zzh"
var age:Int=0
override def toString()="name="+name+" age="+age
} object Serialize {
def main(args: Array[String]): Unit = {
val file = new File("person.out") val oout = new ObjectOutputStream(new FileOutputStream(file))
val person = new Person
oout.writeObject(person)
oout.close() val oin = new ObjectInputStream(new FileInputStream(file))
val newPerson = oin.readObject()
oin.close();
println(newPerson)
}
}
//反序列化后的输出
//name=null age=0

加入公众微信号,能够了解很多其他最新Spark、Scala相关技术资讯

Scala入门到精通——第十六节 泛型与注解的更多相关文章

  1. Scala入门到精通——第二十四节 高级类型 (三)

    作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Man ...

  2. Scala入门到精通——第十五节 Case Class与模式匹配(二)

    本节主要内容 模式匹配的类型 for控制结构中的模式匹配 option类型模式匹配 1. 模式的类型 1 常量模式 object ConstantPattern{ def main(args: Arr ...

  3. Scala入门到精通——第二十九节 Scala数据库编程

    本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...

  4. Scala入门到精通——第十九节 隐式转换与隐式參数(二)

    作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...

  5. Simulink仿真入门到精通(十六) Simulink基于模型设计的工业应用概述

    16.1 Simulink用途概述 在基于模型设计广泛应用于汽车电子嵌入式开发的今天,MBD(Model Besed Design)技术也逐步推广到各种嵌入式控制方面.与传统的嵌入式开发相比,BMD以 ...

  6. Scala入门到精通

    原文出自于: http://my.csdn.net/lovehuangjiaju 感谢! 也感谢,http://m.blog.csdn.net/article/details?id=52233484 ...

  7. Simulink仿真入门到精通(十九) 总结回顾&自我练习

    从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...

  8. 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

    第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...

  9. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

随机推荐

  1. 阿里云人脸比对API封装

    这是根据封装是根据阿里云官方给的Demo进行修改的,当时是因为编写微信小程序云函数需要使用到阿里云人脸比对接口,才对其进行封装的. 记录下来,方便下次使用. 复制下来可以直接使用. 用到的依赖如下: ...

  2. Hibernate-03 关联映射

    学习任务 关联映射 inverse属性.cascade属性 单向的多对一.双向的一对多映射 多对多映射 关联关系 类与类之间最普遍的关系就是关联关系. 单向的关联 双向的关联 单向多对一关联 以Emp ...

  3. Oracle清空数据库中数据表数据的方法

    一.简介最近在项目发版测试的时候,导出dmp的时候不小心把开发库中的一些脏数据导出来了,测试那边导入进去之后一堆不规范的数据,为了不影响测试结果,于是总结了一个快速清空数据库数据表所有数据的方法. 二 ...

  4. Linux常用命令大全3

    linux命令1,关机shutdown -h now2,init 0 关闭系统3,shutdown -h hours:minutes &按预定时间关闭系统4,shutdown -c取消按预定时 ...

  5. react-native 在新版Xcode(10+)中运行出现的问题: node_modules/react-native/third-party/glog-0.3.4 , C compiler cannot create executables

    报错发生在 react-native : 0.55.4 (或存在于更低的版本) 报错: ----/node_modules/react-native/third-party/glog-0.3.4': ...

  6. 4 SQL 数据更新

    4 数据更新 4-1 数据的插入(INSERT语句的使用方法) 通过create table语句创建出来的表,可以将其比作一个空空如也的箱子.只有把数据装入到这个箱子后,它才能称为数据库.用来装入数据 ...

  7. Apache web服务

    1.apache 1> 世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2> http 超文本协议 HTML超文本标记语言 3> URL 统一资源定位 ...

  8. centos6.7升级python3.6.1

    --安装依赖包 yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel ...

  9. 牛客网 牛可乐发红包脱单ACM赛 B题 小a的旅行计划

    [题解] 题意其实就是把n个物品分成4个集合,其中三个集合不可以为空(只属于A.只属于B.AB的交),一个集合空或者非空都可以(不属于A也不属于B),问有多少种方案. 考虑容斥,4个集合都不为空的方案 ...

  10. Python补充--Python内置函数清单

    Python内置函数 Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些函数,不需要定义.最常见的内置函数是: print(&quo ...