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


在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 error
Integer 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.Integer
at 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/

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值