`
一顿饺子
  • 浏览: 50890 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义泛型的使用

    博客分类:
  • Java
阅读更多
自定义泛型
自定义泛型的小例子
第一个例子
1:方法:
private  int add(int x,int y) {
  return x+y;
}
当调用该方法的时候
this.add(3,5);
this.add(“3”,”5”)编译器会报错。因为add()方法的参数是String
那么如何做到通用呢?方法是采用泛型
private T add(T x,T y) {
   return x+y;
}
T是什么东西呢?T可以理解为Type的简称,就是代表着一种类型。一种模糊的类型,说不准是什么类型,他是什么类型是由你传过来的实参类型来决定的。
采用如上方法,你会发现,编译出现错误。因为你写了T编译器不知道这个T是什么东西。所以你要告诉T是什么东西,让编译器认识他。在返回类型前加上<T>就可以了,如下
    private <T> T add(T x,T y) {
       return x+y;
}
改成如上方法后,你会发现return x+y编译错误,因为对于T来讲”+”操作符不知道是否存在。
所以 不能用X+Y,这里我们只是为了说明泛型,所以就先让他返回NULL
    private <T> T add(T x,T y) {
       return null;
}这样编译就不会报错了
再次调用
this.add(3,5);
  this.add(3.5,4);
this.add(“aa”,”bb”);
就不会出错了
第二个例子 交换数组元素的位置
交换方法:
private <T> void swap(T arr[],int x,int y) {
T temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;

}
调用交换方法:
  testT.swap(new String[]{"1","2"}, 0,1);
  testT.swap(new int[]{1,2}, 0, 1);
你会发现参数为new int[]时,编译器报错,因为只有引用类型才能替换泛型<T>,那么为什么第一个小例子中调用this.add(3,5)时,用3,5替代T x,T y呢,因为Jvm会把没有显示注明类型的3,5会当成Interger,所以不会报错,但是当用new int[]时,显示注明了int,jvm不能随便就转换成Interger,他就是一个int,所以不能替换<T>

定义泛型的时候可以用extends限定类型 T extends Object 说明你定义的这个模糊类继承Object,即T必须是Object

以上说的都是针对方法的泛型,下面我们说说类的泛型
为什么会出现类的泛型,有什么用?
比如:我们需要一个通用的Dao ,封装一下CRUD操作,根据传入的对象,来惊醒CRUD该对象。按照我们上面所知道的,方法的泛型,Dao应该是下面那样的



DAO:public class TestDao {
   //增加
public <T> void add(T x) {
}
  //查询
public <T> T findById(int id) {
return null ;
}
}
实际调用时:
       我要增加一个狗
  New TestDao().add(new Dog());
      却可以查询出一个猫来
      Cat cat =New TestDao().findById(1);
这样肯定是不可以的,那么如何做到,Dao中所有方法操作的对象必须一致呢,如果你增加的是狗,那么这个Dao对象所有的方法都是针对狗的,不应该用这个Dao还可以查出别的对象来。
采用类的泛型就可以做到一点
修改Dao如下
   public class TestDao<T> {
public void add(T x) {
}
public T findById(int id) {
return null ;
}
}
在类名的后面表上<T>就可以控制了
实际调用时:
//这句话就说明,这个Dao是操作Dog的DAO
TestDao<Dog> dao = new TestDao<Dog>();
Dao.add(New Dog());
//如果你写成Dao.add(New Cat())编译器就会报错
Dog dog = dao.findByName(1);
如果你写成Cat cat =dao.findByName(1)编译就会报错
注意:在类的泛型中,不能包含静态的变量和静态的方法,因为,泛型类是通过new的时候传入一个实参类型,把泛型确定的,如果有静态的,直接用类名去调用,泛型类不知道是什么类型的,所以报错,如果想在泛型类中用静态方法,则在那个静态方法中使用方法泛型
public class TestDao<T> {
public void add(T x) {
}
public T findById(int id) {
return null ;
}
public  static <E> E delete(E x) {
return null;
}

}
0
2
分享到:
评论
2 楼 一碗三餐 2012-02-28  
private T add(T x,T y) {
   return x+y;
}
你觉得对吗?
1 楼 Johnhe 2010-08-02  
抄袭人家的东西。没有自己的见解

相关推荐

Global site tag (gtag.js) - Google Analytics