说到泛型,我们不得不先说说Java集合的缺点:
- 当我们把一个对象加入集合后,集合就会忘记这个对象的数据类型,当再次取出对象时,该对象的编译类型就变成了Object类型(但是运行时的类型没有改变)。
- 编译时不检查类型的异常(看下面的代码)
如果希望创建一个List对象,且该对象只能保存字符串类型,那我们可以扩展ArrayList,下面这个List集合里只能存放String对象。
看下面的代码
package com.leilei; import java.util.ArrayList; import java.util.List; public class ListError { /** * @param args */ public static void main(String[] args) { //给你一个list里同时添加字符串和int数据 List strList = new ArrayList(); strList.add( "hello1"); strList.add( "hello2"); strList.add( "hello3"); strList.add(4); System. out .println(strList); //遍历数组 for (Object obj:strList){ String strList1 = (String) obj; System. out .println(strList1); } } }
----------------------运行结果---------------------[hello1, hello2, hello3, 4]hello1hello2hello3Exception in thread "main" java.lang.ClassCastException : java.lang.Integerat com.leilei.ListError.main( ListError.java:22 )可以看见 strList.add(4)视图向List集合里添加一个int类型,在编译的时候并不报错,因为下面的system能成功的打印数组的信息 [hello1, hello2, hello3, 4],但是在遍历数组取出List的数据时, String strList1 = (String) obj;试图将int类型转换成String类型。这个时候程序就会抛 java.lang.ClassCastException 异常。
在引入泛型以后(看下面的代码)package com.leilei; import java.util.ArrayList; import java.util.List; public class ListError { /** * @param args */ public static void main(String[] args) { List<String> strList = new ArrayList<String>(); //给你一个list里同时添加字符串和int数据 strList.add( "hello1"); strList.add( "hello2"); strList.add( "hello3"); strList.add(4); System. out .println(strList); //遍历数组 for (int i=0; i < strList.size(); i++){ System. out .println(strList.get(i)); } } }
在程序的17行出现了编译错误,因为在List<String>定义的时候约束了list只能接收String类型的数据。这下 可以看见泛型的好处了吧。
希望以上资料对大家有帮助,欢迎关注我的新浪微博:http://weibo.com/419768151