我觉得学习一个东西,首先得从概念上明白它大概是什么?

  “泛型”就是“参数化类型”,也就是是把类型当成了一种参数。之前我们看到得函数方法比如:

public long add(int num1,int num2){...}

  其中add()方法的两个参数均是int类型的,而int数值范围是固定不变的,假如有时候加数的值比较大,可能是long类型,那么我们难道还专门去写一个函数吗?

public long add(long num1,long num2){...}

  如果采取这样的方式,首先绝对能实现,但是代码的利用率貌似很低,因为加数有各种各样的类型,且不方便统一管理。

  我感觉泛型的功能主要就是解决这个问题的,将原来具体的类型参数化(类型形参),在调用的时候再传入具体的类型(类型实参)。泛型可以用在类、接口和方法中,分别称为:泛型类、泛型接口、泛型方法。当然,使用泛型最广的地方往往还是在使用集合的时候。

  来看一个相当经典的例子:

 package testFX;
import java.util.*;
//学习Java泛型
public class FXStudy {
public static void main(String[] args)
{
ArrayList list =new ArrayList();
list.add(123);
list.add("il18");
list.add("2098");
for(int i=0;i<list.size();i++)
{
System.out.println((String)list.get(i));
}
}
}

  运行结果:

  

  抛出异常:Integer不能转换成String。同时也说明一个问题,集合中添加的数值类型都会自动装箱,也就说名数值的类型均是其对应的包装类,而不是基本数据类型,这里也再次印证一句话:集合就是存储对象的容器。

  接着学习,因为集合类均可以存储任意类型的对象,所以Integer、String等等都可以存储,但是上例中,我们再次使用时,却都以String类型进行使用,所以程序肯定会报错的。这时候,我们就可以使用泛型,让程序在编译的时候就不能通过。参数化类型的具体格式: 

ArrayList<参数化类型> 变量名=new ArrayList<参数化类型>();

  如果“参数化类型”是String,那么该集合中就被限定只能存储String类型的元素。

  那我就按照上述手段修改一下那个例子,看看结果:

  果然如此,添加了泛型后,该集合添加了一个Double类型的数据123.8,显然它不是String类型,所以在敲代码的时候(编译阶段)直接报错了。

泛型的特点:

  泛型只发生在编译阶段,就是在程序运行的过程中,不包含一切有关泛型的信息。例如: 

 package testFX;
import java.util.*;
//学习Java泛型
public class FXStudy {
public static void main(String[] args)
{
ArrayList<String> list =new ArrayList<String>();
ArrayList list1 =new ArrayList();
Class Stringclass = list.getClass();
Class Normalclass = list1.getClass();
if(Stringclass == Normalclass)
System.out.println("类型相同!");
}
}

输出结果:

  上面代码在运行过程中,list与list1的类型均是ArrayList。这里为了让我自己理解得更加深入,我决定研究一下泛型的来龙去脉,都知道泛型是JDK1.5之后才出现的技术,那么之前是怎么实现类似于泛型的技术呢?

  老师说了,因为在Java中所有类的超级父类就是Object类型,所以那时候我们一般这样写:

 package testFX;
import java.util.*;
//学习Java泛型
public class FXStudy {
public static void main(String[] args)
{
//生成一个Double类型的
ObjectC demoDouble = new ObjectC(123.5);
//生成一个String类型的
ObjectC demoString = new ObjectC("liuz");
System.out.println((Double)demoDouble.getTemp());
System.out.println((String)demoString.getTemp());
}
}
class ObjectC {
private Object temp;
public ObjectC(Object x) {
temp = x;
}
public Object getTemp() {
return temp;
}
public void setTemp(Object x) {
temp = x;
}
}

运行结果:

  注意观察代码的11行与12行,都存在强制转型,并且从Object转型到String(或Double),属于向下转型,大家都知道向上转型是安全的,但是向下转型不是安全的,在这个例子中,就是我们必须知道Object对象到底指代的是字符串型还是整数型或者其他数据类型,才能让它转换成相应的形式,否则运行时会出现“类型不匹配”的异常。这样来实现的“泛型”真是比较繁琐,而且容易出错。然而在JDK1.5以后引入了真正的泛型技术,在应用层面上那就简单了很多,前面已经举过例子了。

泛型类是什么鬼?

  集合类就属于泛型类。看最开始的例子,限定存储什么类型,那么就只能存储什么类型,而且我觉得对于我自己来讲,可能应用最多的场合也就是泛型类。所以明白了上面举的例子,至少看懂别人的Java代码问题不大。不过,既然学习,再深入一点吧。

  泛型类的一般格式:

class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
private 泛型标识 /*(成员变量类型)*/ var;
.....
}
}

  过于抽象,那么格式简单,但是不好理解。所以我还是写一个具体的泛型类,就把原来的“泛型”改写成真正的 泛型,如下:

 package testFX;
import java.util.*;
//学习Java泛型
public class FXStudy {
public static void main(String[] args)
{
//生成一个Double类型的
NowFX demoDouble = new NowFX(123.6);
//生成一个String类型的
NowFX demoString = new NowFX("liuz");
System.out.println(demoDouble.getTemp());
System.out.println(demoString.getTemp());
}
}
//泛型类的具体写法
class NowFX<T>{//T是任意的,随便选择符号,凭心情即可
private T temp;
public NowFX(T x) {
temp = x;
}
public T getTemp() {
return temp;
}
public void setTemp(T x) {
temp = x;
}
}

  必须明确的是,T只是一个代表类型的符号,且只能是类类型,不能是基本数据类型(如int、double等,不过它们的包装类属于类类型)。泛型接口和泛型类定义方法类似,不再赘述,多看看别人优秀的源码即可。不过要注意一点就是在写泛型接口的实现类的时候,需要将泛型的声明一起加入到该类中,也就是说该类是一个泛型类。

泛型方法、通配符泛型‘?’、多接口泛型、限制泛型等知识点

这些属于高级泛型,请看文章《Java之泛型深解》。

【转载请注明出处】

  

    

Java之泛型浅解的更多相关文章

  1. Java的泛型详解(一)

    Java的泛型详解 泛型的好处 编写的代码可以被不同类型的对象所重用. 因为上面的一个优点,泛型也可以减少代码的编写. 泛型的使用 简单泛型类 public class Pair<T> { ...

  2. Java基础 - 泛型详解

    2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...

  3. Java之泛型深解

    泛型的内容确实很多,在上一篇Java之泛型浅解讲到了一些常用的泛型,但是还远远不够,上一篇的内容比较容易理解,这一篇我自己觉得更加难理解一些,因此,我还得想办法让它更加接地气更加容易理解,方便我和源宝 ...

  4. java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...

  5. 【转】java 泛型详解

    java 泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 ...

  6. 【转载】Java泛型详解

    [转载]http://www.importnew.com/24029.html 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考 ...

  7. java 泛型详解(普通泛型、 通配符、 泛型接口)

    java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...

  8. java基础(十二 )-----Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到 ...

  9. Java基础11:Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 本文参考https://blog.csdn.net/s10461/article/details/53941091 具体代码在我的GitHub中可以找 ...

随机推荐

  1. 好文章收藏--五分钟理解一致性哈希算法(consistent hashing)

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  2. 关于JQ checkbox选择的问题

    今天做了一个狠坑爹的事情. $("#dele_chk").bind('click',function(){ if($(this).attr('checked')){ $(" ...

  3. vue+mousemove实现拖动,鼠标移动过快拖动就失效

    今天用vue+原生js的mousemove事件,写了个拖动,发现只能慢慢拖动才行,鼠标只要移动快了,就失效,不能拖动了: 搞了半天在,总算解决了,但是问题的深层原理还没搞清楚,知道的大侠可以留言分享, ...

  4. 使用CSDN CODE来存放OPENSTACK位于GITHUB上的源代码

    use CSDN CODE to pull openstack codes 2014-11-20 Author:Hyphen 问题 直接从GITHUB上获代替码,常常是没保障,特别是用DEVSTACK ...

  5. 百度地图SnapshotReadyCallback截屏

    今天碰到了地图截图的功能,不太会,查查资料知道怎么弄了,跟大家分享一下 直接上代码,弄了一个方法,将截取的图片上传至服务器,返回给我们图片路径 //获取地图截图 private void getscr ...

  6. jquery 与javascript关系 ①取元素 ②操作内容 ③操作属性 ④操作 样式 ⑤ 事件 点击变色

    jQuery的min版本和原版功能是一样的,min版主要应用于已经开发成的网页中,而非min版 的文件比较大,里面有整洁的代码书写规范和注释,主要应用于脚本开发过程当中. JQuery是继protot ...

  7. Biorhythms

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 135099   Accepted: 43146 Description So ...

  8. 合理的布局,绚丽的样式,谈谈Winform程序的界面设计

    转载,不错的学习文章 阅读后,起初不太明白,试验了几次后明白了dev的强大.从事Winform开发很多年了,由于项目的需要,设计过各种各样的界面效果.一般来说,运用传统的界面控件元素,合理设计布局,能 ...

  9. 九度OJ 1336:液晶屏裁剪 (GCD)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:983 解决:228 题目描述: 苏州某液晶厂一直生产a * b大小规格的液晶屏幕,由于该厂的加工工艺限制,液晶屏的边长都为整数.最近由于市场 ...

  10. springboot + swagger2 学习笔记

    引入步骤 1.添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springf ...