您的位置:首页 > 编程语言 > Java开发

谈谈我对Java中泛型的理解

2014-12-16 19:39 190 查看
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<String, String> mapNew = new HashMap<String, String>();
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定义了<K,V>泛型,这样子我们就能很随意的设定了放入map中的类型了。



Map<String, Integer>
Map<String, Float>
Map<Float, String>
……


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

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


泛型是不是很不错啊?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: