泛型

概念

泛型的本质是类型参数化,解决不确定具体对象类型的问题.

泛型可以定义在类,接口,方法中,编译器通过识别尖括号和尖括号内的字母来解析泛型.在泛型定义时,约定俗成的符号包括: E代表Element,用于集合中的元素,T 代表 the Type of object ,表示某个类; K 代表 Key ,V代表Value,用于键值对元素.

解析泛型

public class GennericTest<T> {
	static <String,T,Person> String get(String string, Person p){
		return string;
	}

	public static void main (String[] args){
		Integer first =2222;
		Long second =3333;
		//调用上方定义的get方法
		Integer result = get(first,second);
	}
}

以上代码编译正确且可以正常运行,get()是一个泛型方法,first并非是java.lang.String 类型,而是泛型标识,second值代Person.
get()中其他没有被用到的泛型符号并不会导致编译出错,类名后的T与尖括号内的T相同也是合法的,当然在实际应用时,并不会存在这样的定义方式,这里只是期望能够对以下几点加深理解:

  1. 尖括号里的每个元素都指代一种未知类型.(String出现在尖括号里,它就不是java.lang.String,而仅仅是一个代号)
  2. 泛型在定义处只具备执行Object方法的能力.(因此在get()内部只能调用Object类中的方法,如toString())
  3. 尖括号的位置非常讲究,必须在类名之后或方法返回值之前.
  4. 对于编译之后的字节码指令,其实没有这些花头花脑的方法签名,充分说明了泛型只是一种编写代码时的语法检查.在使用泛型元素时,会执行强制类型转换:

INVOKESTATIC com/person/easy/coding/generic/GenericTest.get(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
CHECKCAST java/lang/Integer

这就是类型檫除,CHECKCAST指令在运行时会检查对象实例的类型是否匹配,如果不匹配,则抛出运行时异常 ClassCastException.
编译后,get() 的参数时两个Object,返回值也是Object,尖括号里很多内容消失了,参数中也没有String和Person两个类型.数据返回给Integer result时,进行了类型强制转换.

泛型优势

泛型就是在编译期增加了一道检查而已,目的是促使程序员在使用泛型时安全放置和使用数据.使用泛型的好处包括:

  • 类型安全.放置的是什么,取出来的自然是什么,不用担心会抛出ClassCastException异常.
  • 提升可读性. 从编码阶段就显式的知道泛型集合,泛型方法等处理的对象类型是什么.
  • 代码重用. 泛型合并了同类型的处理代码,使代码重用度变高.

使用泛型,可以避免使用Object 作为输入和输出,带来的强制转换的风险.只要这种强制转换的风险存在,根据墨菲定律,就一定会发生ClassCastException异常.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值