自定义泛型的使用

自定义泛型
自定义泛型的小例子
第一个例子
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值