谈谈我对Java中泛型的理解

eg1:
Map map = new HashMap();
map.put("key" , "xuqiang");
String s = (String) map.get("key");
大家都知道,存放在 java 容器里( Java 容器类包含 List ArrayList Vector map HashTable HashMap 、Hashset 的是 Object 对象,当我们从容器取出时,需要强制转换。
eg1当中,当我们取出map的值时就将值强制转换成了String类型。


由于Java语言里面所有的类型都继承于java.lang.Object,那Object转型为任何对象成都是有可能的。
但是也因为有无限的可能性,就只有程序员和运行期的虚拟机才知道这个Object到底是个什么类型的对象。.
在编译期间,编译器无法检查这个Object的强制转型是否成功,如果仅仅依赖程序员去保障这项操作的正确性,许多ClassCastException的风险就会被转嫁到程序运行期之中。

如果你是oracle的工程师,自然而然会想,能不能限定放入容器的类型呢?这时候泛型就应运而生了。 泛型的核心思想就是 由程序员指定类型,这样集合就只能容纳该类型的元素。

eg2:           
Map mapNew = new HashMap();
mapNew.put( "keyNew", "xuqiangNew");
String sNew = mapNew.get("keyNew");

在eg2中,限定了放入的类型是String,当然取出来的时候也不用强转了。

在JDK1.5之后,java引入了泛型的概念, 它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。
这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。

Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。oracle工程师赞不赞?

泛型带来了很多好处:

1、类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
2、Java 程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String 列表”或者“String 到 String 的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
3、消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

继续研究eg2,打开Map源码,可以看到map定义了泛型,这样子我们就能很随意的设定了放入map中的类型了。
谈谈我对Java中泛型的理解_第1张图片

Map
Map
Map
……

在实际使用时,我们也可以定义自己想定义的泛型。
使用举例:
eg3:
实体类:
public class Person {
     
     private A a;
     
     void setAge(A a){
            this. a = a;
     }

}
使用:
//塞入Integer类型
Person person = new Person();
person.setAge(24);
//塞入String类型           
Person person2 = new Person<>();
person2.setAge( "24");

泛型是不是很不错啊?

你可能感兴趣的:(Java)