在用Java写颠倒数组的时候,突然想到了C++的template,发现Java是以泛型来处理这个问题的,因此决定总结一下
1.泛型定义规则(与C++类比):
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),在返回类型之前(即下面例子中的<T>)同C++中的template <typename T>
- 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。同C++中定义泛型算法,<typename IteratorType,typename elemType>
- 注意泛型的类型参数只能代表引用型类型(类似C++的指针),不能是原始类型(如int,double,char的等)这一点和C++的template不同!
- java的数据类型如下图:
- “==”作用在引用数据类型间,判断内存地址是否相等,想判断内容实体用equals;
- 基本传值传参传的是副本,修改后原值不变;引用传值传参穿的是地址,修改后原值改变。
- 如果要对原始类型编写泛型函数,就要用Integer或Doulbe等Number类,Characte类,即int a[]改成Integer a[]
- 貌似只有一种情况可以对原始类型定义泛型:单个变量时
public class JavaTemplate {
public static<T> void ReverseArray (T[] TgData){
int nLen = TgData.length;
for(int i=0;i<nLen/2;++i){
T nTemp = TgData[i];
TgData[i] = TgData[nLen-1-i];
TgData[nLen-1-i] = nTemp;
}
}
public static<T> void PrintArray(T[] TgData){
for(int i=0;i<TgData.length;++i)
System.out.printf("%s ",TgData[i]);
System.out.print('\n');
}
public static <T> void PrintT(T output){
System.out.print(output);
System.out.print('\n');
}
public static void main(String []args){
Integer ArrayInt[] = {1,2,3,4,5,6};
PrintArray(ArrayInt);
ReverseArray(ArrayInt);
PrintArray(ArrayInt);
Double ArrayDouble[] = {1.0,2.0,3.0,4.0,5.0};
PrintArray(ArrayDouble);
ReverseArray(ArrayDouble);
PrintArray(ArrayDouble);
Character ArrayChar[]={'1'};
PrintArray(ArrayChar);
ReverseArray(ArrayChar);
PrintArray(ArrayChar);
double d = 8.8;
PrintT(d);
int n = 8;
PrintT(n);
}
}
2.通过继承让泛型中的类型参数有界:
以泛型找出最大值为例,对于操作数值的方法肯定只希望接受Number类的实例,可以用extends或implements
public class MaxOf3Number {
public static<T extends Comparable<T>> T Maximum (T x,T y,T z){
T max = x;
if(max.compareTo(y) <= 0)
max = y;
if (max.compareTo(z) <= 0 )
max = z;
return max;
}
public static void main(String []args){
int x=1,y=2,z=3;
System.out.printf("%d,%d,%d的最大值为:%d\n",x,y,z,Maximum(x,y,z));
Double a=2.0,b=5.0,c=3.0;
System.out.printf("%1f,%1f,%1f的最大值为:%1f\n",a,b,c,Maximum(a,b,c));
char d='d',e='e',f='f';
System.out.printf("%s,%s,%s的最大值为:%s\n",d,e,f,Maximum(d,e,f));
}
}
还有泛型类的概念,不过因为暂时用不到,所以Java泛型就点到这里为止,以后有需要再续……