泛型言简意赅
来源:互联网 发布:it培训课程 编辑:程序博客网 时间:2024/05/22 00:45
第一个例子
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;
}
}
from:http://mgz-99-163-com.iteye.com/blog/701627
- 泛型言简意赅
- 言简意赅
- C#委托事件(言简意赅)
- html 、javascript、css言简意赅
- 言简意赅话死锁
- 言简意赅话彩虹, 虹,霓
- HTTP协议(言简意赅,总结到位)
- 言简意赅RSS(really simple syndication)
- 【言简意赅,叼】c++中->怎么用
- 言简意赅剖析计算机使用补码的意义
- 《言简意赅之Linux设备驱动编程》 前言
- 摘要:言简意赅 提纲挈领——六谈科技论文写作
- [言简意赅]ccx-lua 和 ccx-js 相比有哪些优势
- java 值传递 引用传递的理解 言简意赅 一字千金
- 动画~~~~~~~~~感觉这个写的更好似的。。言简意赅
- 困惑我们人生的60个问题的答案--言简意赅的开心果,说的多好啊
- 言简意赅:中断中为何不能使用信号量,中断上下文为何不能睡眠
- Nginx简介及使用Nginx实现负载均衡的原理【通俗易懂,言简意赅】
- C语言中的static变量 和 C++中static变量—生成期、作用域、访问约束、对谁可见等
- 垃圾收集与对象引用
- linux查看网络链接状况命令
- gridveiw导出Excel
- 不同子网电脑访问,静态路由表
- 泛型言简意赅
- sqlplus连接、登录命令大全(选择实例登录、连接远程数据库实例等等)
- Selemium IDE安装方法
- 使用HttpClient下载网络图片
- 修改注册表更改cookie目录
- tomcat切换到weblogic注意事项
- 我的GitHub,欢迎大家多给意见
- X86与X64
- 求几个人数和不及格人数