• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

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

Java高级 tiantian 1527次浏览 1个评论 扫描二维码

在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/
喜欢 (2)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 这个写的不对啊,会报错的
    匿名2017-08-31 15:59 回复 Windows 10 | Chrome 45.0.2454.101