理解Java 泛型(一)
来源:互联网 发布:ios ipv6网络问题 编辑:程序博客网 时间:2024/03/29 15:44
一、泛型概念的提出
首先来看下面一个简单的栗子:
public class Test1 {public static void main(String[] args) {// TODO Auto-generated method stubList list = new ArrayList();list.add("abc");list.add("edf");list.add(55);for(int i=0;i<list.size();i++){String temp = (String) list.get(i);System.out.println(temp);}}}
abcedfException in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat demo.Test1.main(Test1.java:22)
可以看出,在输出55的时候报错 :ClassCastException(),类型转换错误,通常是“当前者的域小于后者的域时候出现 ”,例如前者A是子类的对象,而后者B是父类的对象。若A=B,则会抛出该错误。
再仔细看看代码:
定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似ClassCastException()的错误。编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。
通过以上的栗子可以看到,在将字符串装入集合时,编译时无法自动识别错误,但是在取出它时会报错;还有在取出时,需要强制转换类型!
那么有什么办法使得集合记住自己装入的类型,从而阻止其他类型继续装入呢?答案就在“泛型”。
二、什么是泛型?
泛型,即“参数化类型”。具体来说就是,原来在定义变量、方法、类时使用的int ,String,void等进行“参数化”,原来具体的类型现在成为了不确定的。类似于在定义方法时会传入形参,而在调用方法时传入实参。
把上面的栗子采用泛型改写如下:
public class Test1 {public static void main(String[] args) {// TODO Auto-generated method stubList <String> list = new ArrayList();list.add("abc");list.add("edf");//list.add(55); // 编译错误for(int i=0;i<list.size();i++){String temp = list.get(i);System.out.println(temp);}}}
在上面 Code中,加入1个integer类型的数据 55 时会提示编译错误,这是因为在List<String>中限定了加入的元素只能是String 类型的。这样在取出元素时,就不需要进行强转,因为加入的时候就已经确定好了。
泛型不仅有泛型参数,泛型类,还有泛型方法!看以下的栗子:
public class Test2 {public static void main(String[] args) {// TODO Auto-generated method stubGen<String> gen = new Gen<String>("abc");gen.showType();System.out.println("o=="+(gen.getData()));}}class Gen<T>{private T o;public Gen(T a){o=a;}//泛型方法public T getData(){return o;}//显示o的类型public void showType(){System.out.println("类型是:"+o.getClass().getName());}}
泛型的主要好处在于:在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
- 理解Java 泛型(一)
- java代理(一,理解)
- 理解 Java GC(一)
- 理解Java 虚拟机(一)
- java.io理解(一)
- 深入理解java虚拟机读书笔记(一)
- 深入理解Java内存模型(一)
- 深入理解Java Class文件格式(一)
- 深入理解Java Class文件格式(一)
- JAVA IO (一) 基础深入理解
- 深入理解Java Class文件格式(一)
- Java中泛型的理解(一)
- JAVA IO (一) 基础深入理解
- Java中的ArrayList理解(一)
- java 泛型的理解(一)
- 深入理解Java Class文件格式(一)
- Java 泛型理解(一)
- 对于java多线程的理解(一)
- 小白Python学习经历 ——python 安装
- SQL Server 执行计划的理解
- HDFS命令行接口
- Gym 101116K Mixing Bowls
- HLS学习(四)HLSDownloader源码分析(3)总体流程
- 理解Java 泛型(一)
- spring-boot官方文档翻译——第三部分
- bzoj1601[Usaco2008 Oct]灌水
- ubuntu安装和配置SVN
- oracle中的for循环
- 今日进度
- POJ 2386 Lake Counting(水坑计数)
- android基础知识
- shell--vi命令