Scala入门到精通——第十六节 泛型与注解

本节主要内容

  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++代码实现


//注解声明序列化版本
@SerialVersionUID(1000330L)
abstract class A
{ 
  //native用于标记 cplusplusMethod为c或c++中实现的本地方法
  @native def cplusplusMethod()
}

//标记B可被序列化
@serializable
class B extends A{
  //volatile注解标记变量name非线程安全
  @volatile var name:String="B"
  //transient注解用于标记变量age不被序列化
  @transient var age:Int=40

}

添加公众微信号,可以了解更多最新Spark、Scala相关技术资讯
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
img src="http://img.blog.csdn.net/20150803145759823?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" / img src="http://img.blog.csdn.net/20150803145822627?watermark/2/text/aHR0cD

CloudStack 4.5 安装笔记 - 2015-08-06 13:08:27

上个星期安装了下CloudStack 4.5,用于管理XenServer。CloudStack和OpenStack类似,是一个开源的云计算资源管理平台,整体结构大致如下图: Region翻译过来就是区域,是CloudStack中最大的组织单元,一般由多个物理上分离的数据中心组成,每个数据中心又对应一个Zone,叫资源域,当然一个数据中心也可以有多个资源域(Zone),这并不是严格要求的。一般来说,不同Zone之间物理上隔离,可用于冗余灾备。Zone又由Pod(提供点)组成,一个Pod一般对应一个机柜,每个

【Spark】Spark应用执行机制 - 2015-08-06 13:08:49

Spark应用概念 Spark应用(Application)是用户提交的应用程序。执行模式又Local、Standalone、YARN、Mesos。根据Spark Application的Driver Program是否在集群中运行,Spark应用的运行方式又可以分为Cluster模式和Client模式。 下面是Spark应用涉及的一些基本概念: Application:Spark 的应用程序,用户提交后,Spark为App分配资源,将程序转换并执行,其中Application包含一个Driver pro
本节主要内容 Scala I/O操作简介 Scala 写文件 Scala 读文件 Scala 网络I/O 正则表达式简介 Scala正则表达式实战 1. Scala I/O操作简介 I/O操作是一门编程语言中的重要内容,在Scala中,它更多的是调用java中的I/O类或者通过对java中的I/O类进行相应的封装来实现I/O操作。在上一节内容中我们已经用到了I/O操作: trait FileLogger extends Logger { val fileName:String //PrintWriter使
一、简介 想来想去还是写个简介吧… 1.1 CloudFoundry Cloud Foundry是VMware公司推出的一个开源PaaS云平台,似乎号称业界第一个。它支持多种框架、语言、运行时环境、云平台及应用服务,可以用于应用程序的部署和扩展。 它本身是基于Ruby on Rails编写的,有多个相对独立的子系统。系统之间通过消息机制(nats)通信,使平台在各层级都可水平扩展,既能在大型数据中心里运行,也能运行在一台桌面电脑中,二者使用相同的代码库。 1.2 PaaS PaaS 是 Platform-

Region恢复逻辑 - 2015-08-03 22:08:13

Table of Contents Region恢复逻辑 配置参数 Region恢复逻辑 RegionServer出现宕机以后,其上部署的Region将会被Master重新分配处理,由于在宕机前,某些Region的memStore数据可能还没有做flush操作,因此,需要对这部分数据做还原处理,还原过程通过读取HLog文件来实现。 截至到目前为止(1.0版本),HBase共对外声明了两种Region恢复策略,分别基于LOG_SPLITTING和LOG_REPLAY。其中LOG_REPLAY是从0.98版本
豆瓣Redis解决方案Codis安装使用 1.安装 1.1 Golang环境 Golang的安装非常简单,因为官网被墙,可以从国内镜像如studygolang.com下载。 [root @vm root]$ tar -C /usr/local -zxf go1.4.2.linux-amd64.tar.gz[root @vm root]$ vim /etc/profile export GOROOT=/usr/local/go export PATH=$GOROOT/bin:$PATH export GOP

spark 集群运行python作业 - 2015-08-03 22:08:16

今天尝试用刚搭建好的spark集群运行python作业,遇到了一些问题,解决了一些坑的同时也对spark集群的运作和配置方式有了一些比较浅的认识,不像之前那么没有概念了,记录如下,之后还要继续更多的对Hadoop生态圈和spark并行计算框架的探究。 首先说下环境,集群有五个节点,集群环境是用cloudera manager 搭建的,hadoop用的是cloudera的CDH,我对CDH和hadoop之间关系的理解就是与linux和CentOS的关系一样,其他的的相关组件例如Hbase和Hive也是用cl
[Author]: kwu 基于sparksql调用shell脚本执行SQL,sparksql提供了类似hive中的 -e  , -f ,-i的选项 1、定时调用脚本 #!/bin/sh # upload logs to hdfs yesterday=`date --date='1 days ago' +%Y%m%d` /opt/modules/spark/bin/spark-sql -i /opt/bin/spark_opt/init.sql --master spark://10.130.2.20:7

Ubuntu下配置hadoop环境 - 2015-08-03 18:08:24

实现真正的分布式的hadoop,并不是伪分布式的。 一、系统与配置 共准备2台机器搭建Hadoop集群。基于Ubuntu14.04,jdk1.6.0_45,Hadoop1.0.3版本,虚拟机使用VMware10.0 192.168.1.10 NameNode master (master) 192.168.1.20 DateNode slave1(Slave) 我的用户名就hadoop 接下来需要安装一些常用的软件:vim,ssh sudo apt-get updatesudo apt-get insta