`
Que
  • 浏览: 15407 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

略谈泛型

    博客分类:
  • Java
JDK 
阅读更多

  泛型(generic)是参数化类型的能力,其中可以在类、接口、方法中声明一个泛型类型。

 

  我们来对比一下JDK 1.5前后对java.lang.Comparable接口的声明:

 

 

package java.lang;

 

public interface Comparable {
   public int compareTo(Object o);
}
 

    1.5前的版本

 

 

package java.lang;

 

public interface Comparable<T> {
   public int compareTo(T o);
}

   1.5后的版本

 

    后面<T>表示的就是一个泛型类型,当我们要实现的时候可以根据实际情况代替T表示的类型,其中一个很典型的泛型类

ArrayList<T>的声明中,如果我们存入线性表的对象为字符串时,我们可以作以下的声明:

 

    以下两句在编译过程中没有报错,在运行过程中报错了(对比的类型不匹配所致)

 

    

Comparable sample = new String();

 

System.out.println(sample.compareTo(1));

 

     而以下两句在编译的过程中就报错了

 

     

Comparable<String> sample = new String();

 

System.out.println(sample.compareTo(1));

 

     通过对比,可以看出声明为泛型的类,接口,方法等将会使程序的安全性加强。这是其主要优点之一。

 

     我们可以为我们自己定义的类,接口或者方法声明为泛型,下面是演示的是一个声明为泛型的堆栈类

 

     

package pack21_1;

 

/**
 *
 * @author Administrator
 */
public class GenericStack<E>  {
  public final static int INITAL_SIZE=16;
  //声明泛型数组
  private E[] element;
  //声明size
  private int size;
  //无参构造函数
  public GenericStack ( ) {
      this(INITAL_SIZE);
  }
  public GenericStack( int inital_size ) {
      //这里要注意,泛型不能实例化,只能通过强制转换来得到
      element = (E[])new Object[inital_size];
  }
//实现push方法
  public E push( E value ) {
      //判断是否够空间
      if(size>=element.length){
         E[] newElement = (E[])new Object[2*element.length];
         System.arraycopy(element, 0, newElement, 0, element.length);
         element = newElement;
      }

      return element[size++]=value;
  }
//实现pop方法
  public E pop( ) {
      return element[--size];
  }

  public int getSize( ) {
      return size;
  }

}

 

   同时我们也可以声明泛型的接口和方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics