我们在JAVA中处处都用到了范型,JAVA中的范型是从C++模板继承来的,不过JAVA的范型的功能远远没有C++那么强大。
我们知道在C++中模板可以很方便的代替任意类型的数据如下;
template<class T> void show(T x) { cout<<x<<endl ; } |
上面的T可以代表任意类型的数据,这样不是大大减少了函数的重载次数,提高了效率呢。java是从C++过来的,理解了C++,jav也不在话下。
在java中自定义范型也可以用在方法上如下:
1、//这样声明的范型可以代替任意类型数据我们市场用到的键值对Map.Entry<K,V>不就是给予范型的吗
KV都可以代替任意类型的值,但是在java中范型的实际类型必须是引用类型
<K,V> void get(K k,V v) |
2、Java中的范型不能像C++那么灵活
<T> T add(T a,T b) { //return a+b ;//很多人以为java也想C++一样可以这样 ,但是不可以 。 return null; } |
这个返回的null也是有类型限制的,比如上面的ab分别是Integer和String那么就会取他们共同的基类Object做为返回值类型,其他的同理
3、实现任意类型的数组的成员值的交换,注意在自定义范型中范型的实际类型只能是引用数据类型不能是基本数据类型
public static <T> void swap(T[]a,int x,int y) { T tem =a[x] ; a[x]=a[y] ; a[y]=tem ; } |
上面这个方法如果我 swap(new Integer[]{1,2,3,4,5},1,2); //这样就会自动交换下标12的值
但是这样调用就错了 swao(new int[]{1,2,3,5,6},2,3) ; //所以说Java的范型的实际类型 只能是引用数据类型
4、
<T extends String> 表示类型只能是String或者String的派生类
<T super String > 表示范型类型只能是String或者String的父类
用法同上
5、
下面这个函数利用范型来实现类型自动转换的功能
public static <T> T autoConvert(Object obj) //因为返回值是 T标识任意类型 所哟可以 将返回结果赋值给任意类型对象 Object obj==""; String str=autoConvert(obj); |
可以完成自动转换,因为范型T代表任意类型,因此他可以赋值给String类型的对象