一般的类和方法,只能使用具体的类型,要么是基础数据类型,要么是自定义类。
如果要编写可以应用与多种类型的代码,这种刻板的限制对代码的束缚就会很大。
适合用于许多类型。
在面向对象中,多态算是一种泛化机制。
在如图的例子中T就是类型参数
当你创建Holder对象时,必须指明想持有什么类型的对象,将其置于尖括号内,就像main()中那样。然后,你就只能在Holder中存入该类型(或其子类,以为多态与泛型不冲突)的对象了。并且,在你从Holder中取出它持有的对象时,自动地就是正确的类型。
告诉编译器想要什么类型,让后编译器帮你处理一切细节。
一般而言,你可以认为泛型与其他的类型差不多,只不过他们碰巧有参数罢了。
E – Element (在集合中使用,因为集合中存放的是元素)
T – Type(Java 类)
K – Key(键)
V – Value(值)
N – Number(数值类型)
? – 表示不确定的java类型
S、U、V – 2nd、3rd、4th types
1.任何基础数据类型都不能作为类型参数:
学习泛型你会发现,Java泛型的限制之一,不能间基础数据类型用作类型参数。
2.事项参数化接口:
一个类不能同时实现同一个泛型接口的两种变体,由于擦除的原因,这两个变体会成为相同的接口。
3.转型和警告
使用带有泛型类型参数的转型或instanceof不会有任何效果。
4.重载
有与擦除的原因,重载方法将产生相同的类型签名。
5.基类劫持了接口
Java中使用泛型最吸引人的地方就是在容器类中,包括List,各种Set,各种Map。
当一个对象被放置在容器中时,这个对象会北向上转型为Object,因此你会丢失类型信息。java如果类型放置错误导致取出的时候会进行强制类型转换,会得到一个RuntimeException,虽然你能发现问题,当时是在运行时发现的而非在编译发现它的。引入泛型并不会让你误用放入容器中的对象。