Java泛型

泛型的作用:

1.类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

2.Java 程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String 列表”或者“String 到String 的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性

3.消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

协变参数类型:

1.?extends用于方法返回:表示类型的上界,参数化类型可能是T 或是 T的子类。不能通过add方法指定类型,因为不确定究竟是哪个子类。可以直接为其赋值一个T类型的集合,通过get获得各个位置的值。返回的类型是最大上界T。

2.?super用于限定方法入参:表示类型下界(Java Core中叫超类型限定),参数化类型是此类型的超类型(父类型),直至Object。由于编译器并不知道List的内容究竟是哪个超类,因此不允许加入特定的任何超类型。由于多态,加入T类型或T类型的子类是可以的。返回类型是最大的超类object。

类型参数:K(key,键),V(value),E(element),T(Java的实例),N(数字)

类型擦除:

所谓泛型擦除,只是对编译后的代码进行了类型擦除,类型擦除中第一步——将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
这里的左边界可以通过extends来体现。但是元数据中仍然保留了类型信息。这也是我们可以通过反射得到参数化类型的根本依据。

PECS原则

如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)
如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)
如果既要存又要取,那么就不要使用任何通配符。

参考:

https://www.zhihu.com/question/20400700

泛型的使用:泛型类,泛型接口,泛型方法。参见 :                  https://blog.csdn.net/s10461/article/details/53941091

泛型数组:唯一成功创建泛型数组的方法就是创建一个呗擦除类型的新数组然后对其转型。

泛型使用注意:任何在运行时需要知道类型信息的操作都无法执行,例如:instanceOf,new,转型。可以使用动态的isInstance,通过class.newInstance()方法来创建这个类型的新对象。

 

 

posted @ 2018-06-29 18:41  朱子威  阅读(194)  评论(0)    收藏  举报