泛型: 什么是Java泛型?有什么作用?

来源:互联网 发布:手机如何淘宝购物 编辑:程序博客网 时间:2024/05/02 04:34


在JDK的框架集合中,泛型被非常广泛地使用。那么,我们为什么需要在Java中使用泛型呢?如果能很好地理解这个问题,那么很多相关的概念和疑问就能解决了。在本文中,我将使用一个非常简短的例子来阐述:为什么泛型是非常有用的。

泛型概述

在Java中实现泛型机制的目标是为了可以把发现 bug 的时机提前到编程源码时,而不是运行时。如果在编译时就可以发现 bug ,就可以节省大量的调试Java程序的时间,因为编译错误可以比较容易和比较快速地被发现和修复。而且,泛型仅仅只存在于编译时,这个事实也是我们学习Java泛型的过程中必须记住的最重要的一个事实。

回顾历史

为了理解泛型所带来的好处,可以假设泛型不存在,再看看我们的代码模样:

class Room {private Object object;public void add(Object object) {this.object = object;}public Object get() {return object;}}public class Main {public static void main(String[] args) {Room room = new Room();room.add(60);//room.add("60"); //this will cause a run-time errorInteger i = (Integer)room.get();System.out.println(i);}}

在该示例中,Room 类的具有一个类型为 Objcet 的成员变量 object,因为其类型是Java中的超级父类,所以我们可以传递任何的对象给该类,比如 String、Integer 等等。当我们往 Room 中添加一个 Integer 并转换的时候,该代码运行正确。但是,当我们往 Room 中添加一个 String 并转换的时候,该代码在编译时一切正常,在运行时就会抛出一个如下所示的 ClassCastException:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integerat collection.Main.main(Main.java:21)

你可能想:为什么我们不直接把Room类的成员变量object的类型定义为Integer呢?这样做确实可以让上述实例的报错信息提前到编译时。但是,如果这样做,我们就无法传递其他类型的对象,比如 String,给Room对象,这将极大地限制Room类的功能。

引入泛型

针对上述代码示例出现的问题,我们需要引入泛型机制来解决。如果加入泛型机制,上述代码片段将变成如下所示:

class Room {private T t;public void add(T t) {this.t = t;}public T get() {return t;}}public class Main {public static void main(String[] args) {Room room = new Room();room.add(60);Integer i = room.get();System.out.println(i);}}

此时,如果无意间添加了 room.add(“天天编码”) 这条语句,一个编译错误就会被IDE检测并报告:

什么是Java泛型?有什么作用?

可以看到,泛型机制功能强大,逻辑也不复杂。注意:现在不需要对 room.get() 获得对象进行强制类型转换了,因为在编译时就知道了该方法返回结果的类型。

总结

综上所述,使用泛型的理由有三:

  1. 编译时的强类型检查
  2. 消除显示的类型强制转换
  3. 更好的代码复用性,比如实现泛型算法

Java中的泛型仅仅是一个编译时的概念,在运行时,所有的泛型信息都被消除了,这被称为泛型擦除。


天天编码 , 版权所有丨本文标题:什么是Java泛型?有什么作用?
转载请保留页面地址:http://www.tiantianbianma.com/java-generic.html/

原创粉丝点击