自定义泛型
自定义泛型的小例子
第一个例子
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;
}
}
分享到:
相关推荐
Java.SE 自定义泛型与泛型的常见陷阱Java.SE 自定义泛型与泛型的常见陷阱
用C#代码,自定义泛型集合,泛型集合类中需要实现两个元素的交换。
本篇文章是对c#中自定义泛型类的实现方法进行了详细的分析介绍,需要的朋友参考下
·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的方方面面,全而不冗余 ·全程内容涵盖数据结构、设计模式、JVM内存...
NULL 博文链接:https://kanglecjr.iteye.com/blog/2098497
本文实例分析了.NET基础之自定义泛型。分享给大家供大家参考。具体分析如下: 在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:...
本篇文章是对c#中自定义泛型链表类进行了详细的分析介绍,需要的朋友参考下
主要介绍了C#通过反射创建自定义泛型的方法,需要的朋友可以参考下
NULL 博文链接:https://zxlyecf2.iteye.com/blog/1977926
实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门实例讲解Java泛型编程的快速入门
简单的List泛型模拟
Java-Custom-Generics 在 Java 中使用自定义泛型的简单示例
这是一个泛型委托的示例,主要是让初学者了解泛型委托的用法,虽然很简单,但是代码有注释,我的这个例子是在vs2010中做的,用vs08的朋友们,最好还是转一下,但是绝对能实现(本程序是控制台应用程序,适合初学者)...
该文档主要包括为什么使用泛型、在集合中使用泛型、自定义泛型结构、泛型在集成上的体现以及通配符的使用等内容
在方法上定义的泛型,需要通过调用方法时通过给定的参数来进行约束,所以在方法参数列表内必须要有一个参数是对应声明的自定义泛型。 1.2.2 泛型在类中使用 声明格式; class TypeA { } 类声明自定义泛型,需要...
主要介绍了list泛型自定义排序示例,实现List泛型类将制定元素至前排序,大家参考使用吧