文档章节

JAVA泛型学习笔记

猥琐男A
 猥琐男A
发布于 2015/04/28 02:22
字数 1439
阅读 52
收藏 0

    写这个博文的目的:1.校验自己的学习成果的不足,与错误的地方(大牛么看到指正一下)。

                               2.与整天忙于coding的没留意过泛型的同志们一起学习。

废话:

            Java泛型与C++的模板十分类似,感觉JAVA跟C++就是一个原理,大学时着两门语言都看过,感觉JAVA就是C++的简洁版C=>C++=>Java依次进化,逻辑的实现编程越来越简单,

            Java一直承诺是面向对象的编程,在刚学习java时这个给我的印象十分深刻,看了Java泛型设计后,感觉是java那帮人抛弃了自己的诺言,变成了为了实现编程而进行编程,又回到当时学C时的感觉了。

           自己也很水,平时也不怎么使用泛型,用的最多的就是别人写好的,呵呵。

下面写一下自己学习泛型的理解,正在给自己充电各种学习,有不对或不全的地方欢迎大家指正。

一、泛型的使用场景

     我感觉泛型主要用于2方面

        1.JAVA提供的各种容器 比如List Map Set 等

        2.大家在编程中各种操作对象实体的动态生成

            比如:产生Service  Dao的实体操作对象代码中可能会有getService(); getDao()等

二、泛型的作用

    1.减少重复模式代码的编写。

    2.控制类型的安全,这个在JAVA容器中体现较为直观。

三、泛型类的定义

    :一个泛型类就是具有一个或多个类型变量的类。

    例:public class Pair<T>{

            private T first;

            private T second;

            public Pair(){firs= null; second = null;}

            public Pair(T first,T second){ this.first = .......}

            public T getFirst(){return first;}

            pubic T getSecond(){return second;}

            public void setFirst(T fisrt){......}

            public void setSecond(T second){......}

        }

        T 就是Pair类的类型变量,用具体的类型替换类型变量就可以实例化泛型类型,比如Pair<String>

        Pair(String first,String second)

        这时调用getFirst()/getSecond()返回的都是String类型。

        可以把泛型看成产生普通类的一种方式,比如几种类型都用到了Pair类

        比如 Pari<Integer>,Pair<String>用T变量来分别代表String,Integer就减少了这个中类型模式下的重复代码。

        类型安全:不恰当的比喻是Pair没有T泛型时,我们给Pair初始化放入值后,分别放入String变量值与Integer变量值,当我们用String xxx = pair.getFirst(); String xxxx = getSecond();时其中有一个是Integer类型强转肯定汇报错,加上泛型时:就限定了他们两个必须是同一个类型,当时不同类型时是放入不进去的会报错。

说的有点绕,恰当点的就是容器中的限定比如List<String> 结果你放入一个Integer肯定是不行的。

        泛型可以引入多个变量比如 public class Pari<T,V>{......}  T和V分别限定了不同的类型的泛型。

跟上面说的一样,大家可以试试就是 T first;V second;


四、泛型方法的定义

        class ArrayAlg{

            public static <T> T getMiddle<T[] a>{

                return a[a.length/2];}

        }

        

       <T> T :    <T> 是类型变量,T是返回类型。

        String[] names = {"11","22","33"};

        String middle = ArrayAlg.<String>getMiddle(names);

        String middle = ArrayAlg.getMiddle(names);

        这两种取值方式都是正确的,因为参数类型与返回类型都是T 所以当指定了参数类型时,就已经传入了类型变量。

        泛型方法的普通项目中用的最多的:

            public <T> T getObject(Class<T> c){

                    T t = c.newinstance(); return t;    

            }


五、类型变量的限定约束

        限定约束类型变量T,一般是由于泛型方法,或泛型类中指定了特定的实现,而这种特定的实现,并不是所有普通类都具有,可能是只有实现了特定接口的类才能够使用这种泛型类,这就是类型变量T的范围限定。

比如:泛型方法中逻辑实现使用了compare方法,不是所有的Java类型都有compare方法,为了防止出现异常,在类型变量T加以限定 <T extends Comparable>

    指定了送入的类型变量T必须是实现了Comparable接口的类型。

    <T extends Comparable&Serializable&...> T 可以被多个接口限定,如果限定中有一个类,那么这个类必须是extens后面的第一个,

关于泛型造成的多态的混乱大家可以网上搜一下,及解决方法

泛型最好不要使用instanceof类型判断 因为 a instanceof Pair<String> 与a instanceof Pair<T> 都返回true


六、通配符 Pair<? super xxxx>

 extends是用父类限定子类的类型,super是用子类来说明父类,我感觉这样很难理解 只能说明存在这种关系,而且如果是接口的话那么?代表的接口类型也是比较宽泛的


我是这样理解的 <? super xx> a类型 obj实例

                      <? extends xxx> b类型 obj实例

                    a 用于给obj赋值调用setMethod

                    b 用于obj中取值调用getMethod

                    分开理解

                    当xx 表示Manager xxx表示Employee时

                     Pair<Manager> getMethod 可以返回Employee,Pair<Employee>中的set方法可以设置Employee的任何子类,反过来则不行。

分开理解,这是两种类型,放在一起就混了,一个取值一个用,一个放值用。也就是为了实现不同功能的限定


不正确或不足的地方,大家指正!!

 


                

© 著作权归作者所有

猥琐男A
粉丝 0
博文 1
码字总数 1439
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

猥琐男A
猥琐男A 博主
效果不大好啊
Scala学习笔记(1):Scala语言的来源

Scala是“scalable language”,也就是“可扩展”语言是意思。Scala是一种静态类型语言,它融合了函数式编程和面向对象编程和的思想,前者让它可以很方便快速地构建可用程序,后者则让其具有...

chengyao2
2013/04/28
688
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
2018/08/08
0
0
泥沙砖瓦浆木匠/java-core-learning-example

感谢赞助的ta们 Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。 未完成模块:阿里J...

泥沙砖瓦浆木匠
04/02
0
0
Java基础之数组队列及Java堆外内存学习笔记[图]

Java基础之数组队列及Java堆外内存学习笔记[图] 1.数组 1.1 数组基本概念: 数组是一个容器,可以存储同一数据类型的N个数据;数组是一个数据结构,是数据结构中访问速度最快的; 数组是直接...

原创小博客
2018/08/25
28
0
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部