什么是泛型?
泛型(Generic Type或者Generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collection Framework)中看到泛型的动机。例如,Map类允许用户向一个Map添加任意类的对象,最常见的情况是在给定映射(map)中保存某个特定类型(如String)的对象。
因为Map.get()被定义为返回Object,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:
要让程序通过编译,必须将get()的结果强制类型转换为String,并且希望结果真的是一个String。但是有可能用户已经在该映射中保存了不是String的内容,这样的话,上面的代码将会抛出ClassCast Exception。
理想情况下,我们可能会得出这样一个观点,即m 是一个Map,它将String 键映射到String值。这可以让我们消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
泛型的好处是什么?
Java语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,如集合框架,都已经成为泛型化的了。这带来了以下好处:(www.xing528.com)
(1)类型安全。泛型的主要目标是提高Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
Java程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,如“String列表”或者“String到String的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作ClassCast Exception展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
(2)消除强制类型转换。泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
尽管减少强制类型转换可以降低使用泛型类的代码的烦琐程度,但是声明泛型变量会带来相应的烦琐。比较下面两个代码例子。
该代码不使用泛型:
该代码使用泛型:
泛型有三种使用方式,分别为:泛型类、泛型接口和泛型方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。