欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java泛型机制必要性及原理解析

程序员文章站 2022-05-25 22:09:03
泛型程序设计(generic programming)“使用泛型机制编写的程序代码要比那些杂乱地使用object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类尤其有用。”1...

泛型程序设计(generic programming)

“使用泛型机制编写的程序代码要比那些杂乱地使用object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类尤其有用。”

1.意义、必要性、重要性

泛型程序设计 意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集string和file对象分别设计不同的类。实际上,也不需要这样做,因为一个arraylist类就可以聚集任何类型的对象。这是一个泛型程序设计的实例。

事实上,在java增加泛型机制前就存在一个arraylist类。下面借助arraylist类的演变来说明java引入泛型机制到底有重要。

在java引入泛型类之前,arraylist类将维护一个object引用的数组:

public class arraylist{
  private object[] elementdata;
  ...
  public object get(int i){...}
  public void add(object o){...}
}

使用这种arraylist类存在两个问题:

每获取一个值都必须进行强制类型转换。

arraylist files = new arraylist();
...
string filename = (string) files.get(0);

由于没有错误检查,可以插入任意类型的对象。

files.add(new file("..."));

对于上面的操作,编译和运行的时候都不会出错。然而,当其他地方取出该数据,并试图进行强制类型转换时就会产生一个错误。

arraylist files = new arraylist();
//不报错
files.add(new file("..."));
//报错
string filename = (string) files.get(0);

对于上面提到的两个问题,泛型提供了一个很好的解决方案:类型参数(type parameters)。在arraylist类中使用一个类型参数来指示元素的类型:

public class arraylist<e>{
  private object[] elementdata;
  ...
  public e get(int i){...}
  public void add(e o){...}
}

arraylist<string> files = new arraylist<>();

这使得代码具有更好的可读性,人们一看就能知道这个数组列表中包含的是string对象。

同时,编译器也可以很好的利用这个信息。当调用get方法时,因为编译器已经知道返回值是string类型,所以不在需要进行强制类型转换。当调用add方法时,编译器因为知道add方法的参数是string类型,可以对add方法的使用进行检查,避免调用者传入错误类型的参数。

在编译时就发现错误比运行时才发现错误要好得多*,类型参数的魅力在于:使得程序具有更好的可读性和安全性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。