Java 泛型基础

文章目录
    一、泛型的由来
    1、Collection的缺陷
    2、泛型的由来背景
    二、泛型的好处
    1、类型安全
    2、消除强制类型转化
    三、泛型的格式
    1、为什么泛型使用<>
    2、泛型格式
    四、泛型的简单使用

一、泛型的由来
1、Collection的缺陷
Java语言的集合有一个缺点:当我们把一个对象丢进集合后,集合就会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型(其运行时类型没变)。

2、泛型的由来背景
如果能向我们定义数组一样,在定义的时候就能明确指定元素类型,例如ArrayList<String>,这说明此ArrayList只能保存字符串对象。Java的这种参数化类型被称为泛型。
JDK1.5版本后出现的新特性,用于解决安全问题,是一个安全机制。

二、泛型的好处
1、类型安全
将运行时期出现的ClassCastException转移到编译时期,方便程序员解决问题,让运行问题减少,安全。

2、消除强制类型转化
避免了强制转换的麻烦。这使得代码更加可读,并且减少了出错机会。尽管减少了强制类型转换可以降低使用泛型类代码的复杂度,但是声明泛型变量会带来相应的复杂度。

三、泛型的格式
1、为什么泛型使用<>

     {}被程序结构使用,()被参数使用,  [] 被数组使用,就剩<>了。

2、泛型格式
通过<>来定义要操作的引用数据类型(类类型,接口类型,数组除外)。通常在集合中很常见,当使用集合时,将集合中要存储的数据类型作为参数传递要<>中即可。其实<>就是用来接收类型的从JDK1.5后,你可以为任何类或者接口增加泛型声明。

四、泛型的简单使用
1、简单例子演示ClassCastException
我们都知道集合可以装任意对象。并用迭代器去访问集合中的对象。

   public static void main(String[] args) {
   	ArrayList list = new ArrayList();
   	list.add("1");
    list.add("2");
    list.add(4); //  list.add(new Integer(4));    JDK1.5后会自动装箱
   	Iterator it = list.iterator();
   	while(it.hasNext()){
   		String str = (String)it.next();
   		System.out.println(str+":"+str.length());
   	}
   }

运行结果

1:1
2:1
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at com.lemon.GenericTest.main(GenericTest.java:14)

分析:
当用迭代器访问到对象2的时候,强转出现类型错误。注意:这个是在运行期间。我们可以想象,当我们将程序打包给用户的时候,用户处于运行阶段,那是不是就造成程序终止运行。我们希望能在编辑的阶段就能都把这些问题解决掉。问题的产生,就是因为我们往集合中存了不同类型的对象。
于是乎我们将程序修改如下:

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("1");
	    list.add("2");
	    list.add(4); //  list.add(new Integer(4));  
		Iterator<String> it = list.iterator();
		while(it.hasNext()){
			
			String str = it.next();
			System.out.println(str+":"+str.length());
		}
	}

继续编译我们的程序(编译失败,程序由运行时期出现问题转移到编译时期,方便程序员解决问题,让运行时期问题减少),终端命令行:javac GenericDemo.java
在这里插入图片描述
继续修改如下:

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("1");
	    list.add("2");
		Iterator<String> it = list.iterator();  //迭代器声明类型,使用next便不需要强转!!!
		while(it.hasNext()){
			String str = it.next();
			System.out.println(str+":"+str.length());
		}
	}

依然是命令行,javac GenericDemo.java,发现编译通过,并且以前出现类似下面的警告也一并消除了(类型安全)
在这里插入图片描述
2、泛型的基本使用
当我们在看API文档的时候会发现,有些泛型用,而有些用,其实这个T和E只是个形式参数。你可以这么理解,T=type,E=Elements 。
( 1 ) 定义泛型接口:比较器Comator在这里插入图片描述JDK 1.5 后改写了集合框架中的接口和类接口,并为这些接口和类增加了泛型支持。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值