各种泛型定义及使用
1、泛型类定义及使用
我们先看看泛型的类是怎么定义的:
[java]view plaincopy
//定义
class Point
private T x ;
private T y ;
public void setX(T x){//作为参数
this.x = x ;
}
public void setY(T y){
this.y = y ;
}
public T getX(){//作为返回值
return this.x ;
}
public T getY(){
return this.y ;
}
};
//IntegerPoint使用
Point p =new Point
p.setX(new Integer(100)) ;
System.out.println(p.getX());
//FloatPoint使用
Point p =new Point
p.setX(new Float(100.12f)) ;
System.out.println(p.getX());
(1)、定义泛型:Point
首先,大家可以看到Point
(2)类中使用泛型
这个T表示派生自Object类的任何类,比如String,Integer,Double等等。这里要注意的是,T一定是派生于Object类的。为方便起见,大家可以在这里把T当成String,即String在类中怎么用,那T在类中就可以怎么用!所以下面的:定义变量,作为返回值,作为参数传入的定义就很容易理解了。
各种泛型定义及使用
1、泛型类定义及使用
我们先看看泛型的类是怎么定义的:
[java]view plaincopy
//定义
class Point
private T x ;
private T y ;
public void setX(T x){//作为参数
this.x = x ;
}
public void setY(T y){
this.y = y ;
}
public T getX(){//作为返回值
return this.x ;
}
public T getY(){
return this.y ;
}
};
//IntegerPoint使用
Point p =new Point
p.setX(new Integer(100)) ;
System.out.println(p.getX());
//FloatPoint使用
Point p =new Point
p.setX(new Float(100.12f)) ;
System.out.println(p.getX());
前面我们提到ArrayList也是泛型,我们顺便它的实现:
[java]view plaincopy
public class ArrayList
…………
}
看到了吧,跟我们的Point实现是一样的,这也就是为什么ArrayList能够盛装各种类型的主要原因。
相比我们开篇时使用Object的方式,有两个优点:
(1)、不用强制转换
[java]view plaincopy
//使用Object作为返回值,要强制转换成指定类型
Float floatX = (Float)floatPoint.getX();
//使用泛型时,不用强制转换,直接出来就是String
System.out.println(p.getVar());
(2)、在settVar()时如果传入类型不对,编译时会报错
可以看到,当我们构造时使用的是String,而在setVar时,传进去Integer类型时,就会报错。而不是像Object实现方式一样,在运行时才会报强制转换错误。
2、多泛型变量定义及字母规范
(1)、多泛型变量定义
上在我们只定义了一个泛型变量T,那如果我们需要传进去多个泛型要怎么办呢?
只需要在类似下面这样就可以了:
[java]view plaincopy
class MorePoint
}
也就是在原来的T后面用逗号隔开,写上其它的任意大写字母即可。想加几个就加几个,比如我们想加五个泛型变量,那应该是这样的:
[java]view plaincopy
class MorePoint
}
举个粟子,我们在Point上再另加一个字段name,也用泛型来表示,那要怎么做?代码如下:
[java]view plaincopy
class MorePoint
private T x;
private T y;
private U name;
public void setX(T x) {
this.x = x;
}
public T getX() {
return this.x;
}
…………
public void setName(U name){
this.name = name;
}
public U getName() {
return this.name;
}
}
//使用
MorePoint morePoint =new MorePoint
morePoint.setName("harvic");
Log.d(TAG,"morPont.getName:" + morePoint.getName());
从上面的代码中,可以明显看出,就是在新添加的泛型变量U用法与T是一样的。
2)、字母规范
在定义泛型类时,我们已经提到用于指定泛型的变量是一个大写字母:
[java]view plaincopy
class Point
…………
}
当然不是的!!!!任意一个大写字母都可以。他们的意义是完全相同的,但为了提高可读性,大家还是用有意义的字母比较好,一般来讲,在不同的情境下使用的字母意义如下:
E — Element,常用在java Collection里,如:List
K,V — Key,Value,代表Map的键值对
N — Number,数字
T — Type,类型,如String,Integer等等
如果这些还不够用,那就自己随便取吧,反正26个英文字母呢。
再重复一遍,使用哪个字母是没有特定意义的!只是为了提高可读性!!!!
3、泛型接口定义及使用
在接口上定义泛型与在类中定义泛型是一样的,代码如下:
[java]view plaincopy
interface Info
public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
public void setVar(T x);
}
与泛型类的定义一样,也是在接口名后加尖括号;
4、泛型函数定义及使用
上面我们讲解了类和接口的泛型使用,下面我们再说说,怎么单独在一个函数里使用泛型。比如我们在新建一个普通的类StaticFans,然后在其中定义了两个泛型函数:
[java]view plaincopy
public class StaticFans {
//静态函数
public static
Log.d("harvic","StaticMethod: "+a.toString());
}
//普通函数
public
Log.d("harvic","OtherMethod: "+a.toString());
}
}
上面分别是静态泛型函数和常规泛型函数的定义方法,与以往方法的唯一不同点就是在返回值前加上
5、其它用法:Class
(1)、使用Class
有时,我们会遇到一个情况,比如,我们在使用JSON解析字符串的时候,代码一般是这样的
[java]view plaincopy
public static List
List modelList = JSON.parseArray(response, SuccessModel.class);
return modelList;
}
其中SuccessModel是自定义的解析类,代码如下,其实大家不用管SuccessModel的定义,只考虑上面的那段代码就行了。写出来SuccessModel的代码,只是不想大家感到迷惑,其实,这里只是fastJson的基本用法而已。
这段代码的意义就是根据SuccessModel解析出List
[java]view plaincopy
public class SuccessModel {
private boolean success;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
那现在,我们把下面这句组装成一个泛型函数要怎么来做呢?
[java]view plaincopy
public static List
List modelList = JSON.parseArray(response, SuccessModel.class);
return modelList;
}
首先,我们应该把SuccessModel单独抽出来做为泛型变量,但parseArray()中用到的SuccessModel.class要怎么弄呢?
先来看代码:
[java]view plaincopy
public static
List
return modelList;
}
注意到,我们用的Class
这是因为Class
[java]view plaincopy
public final class Class
…………
}
通过Class
(2)、定义泛型数组
在写程序时,大家可能会遇到类似String[] list = new String[8];的需求,这里可以定义String数组,当然我们也可以定义泛型数组,泛型数组的定义方法为 T[],与String[]是一致的,下面看看用法:
[java]view plaincopy
//定义
public static
return arg ; // 返回泛型数组
}
//使用
public static void main(String args[]){
Integer i[] = fun1(1,2,3,4,5,6) ;
Integer[] result = fun1(i) ;
}
我们先看看 定义时的代码:
[java]view plaincopy
public static
return arg ; // 返回泛型数组
}
首先,定义了一个静态函数,然后定义返回值为T[],参数为接收的T类型的可变长参数。如果有同学对T...arg的用法不了解,可以去找下JAVA 可变长参数方面的知识。
由于可变长参数在输入后,会保存在arg这个数组中,所以,我们直接把数组返回即可。
转自:http://blog.csdn.net/harvic880925/article/details/49872903