`
liuhaifang
  • 浏览: 8712 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

黑马程序--java泛型实例

 
阅读更多

-------------------------------------------android培训期待与您交流 -------------------------------------

泛型:
泛型只是给编译器查看的,在编译后类型信息会被擦除的。所以可以调用反射方法往定义了泛型集合了添加不同类型的对象

ArrayList<E> 称为泛型类型,其中E称为类型变量或类型参数
ArrayList<Integter>称为参数化的类型,integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中 <> 读做Typeof
Array成为原始类型

参数化类型与原始类型是兼容的如

Conllection<String> c=new Collection();//可以通过编译
Conllection c=new Collection()<String>;//可以通过编译

 

参数化类型不考虑类型的继承关系

Vector<String> v=new  Vector<Object>//不可以通过编译
Vector< Object> v=new  Vector< String>//不可以通过编译

Vector< String > v=new  Vector< String>
printCollection(v)//编译不通过,参数化类型不考虑类型的继承关系
Public void printCollection(Collection<Object>)//可以使用通配符?

 

在创建数组实例时,数组的元素不能使用参数化类型

Vector<String> v[]=Vector<String>//不可以通过编译

 
注:Vector v=new Vector<String> //可以通过编译
Vector< Object> v2=v; //可以通过编译,编译器是严格按照语法一句一句编译的



泛型化类型会根据根据两者的内容去两者的交集
.add(3,5) //可以通过编译 两个Integer 交集就是Integer
.add(3.5,5)// /可以通过编译 一个float类型与一个integer类型的交集是Number类型
.add(3, "abc")///可以通过编译 一个integer类型与string类型的交集是Object类型

Private static  <T> T add(T x,T y){
Retrun x ;
}

 
注:如果形式参数是泛型参数T,则实参必须是引用类型,在上例中编译器会自动给我装箱成Interger等引用类型 如果是数组,则不会自动装箱


异常泛型

在泛型中可以同时有多个类型参数,在定义它们的括号中用逗号分隔,例如

public static void main(String[] args) {
fangxing f=new fangxing();
int a= f.add(10, 30);//可以通过编译
Number b=f.add(5.5, 30);//可以通过编译
Object c=f.add(10, "bbbbb");//可以通过编译
f.add(new String[]{"a","b","c"},1,2);//可以通过编译
f.add(new int[]{1,2,3},1,2);//编译不通过
}
public <T> T add(T x,T y){
return null;
}
public <T> T add(T[] x,int y,int z){
T temp=x[y];
x[y]=x[z];
x[z]=temp;
return null;
}
public static <T,M,B> T getValue(T a,M b){

return null;
}

 
泛型的类型推断




通过反射获得泛型的实际参数类型
通过方法获取
如 取得applyVector方法中形式参数Vector的类型类型:

public class fangxing {
public static void main(String[] args) throws Exception{
Method applyMethod = fangxing.class.getMethod("applyVector", Vector.class);//通过反射获取方法
Type[] types = applyMethod.getGenericParameterTypes();//获取有泛型的参数Type数组
ParameterizedType pType = (ParameterizedType)types[0];//根据方法有几个参数转为参数化类型
System.out.println(pType.getRawType());//获取参数的原始类型,即class java.util.vector 
System.out.println(pType.getActualTypeArguments()[0]);//获取实际化类型的参数

}

public static void applyVector(Vector<Date> v1){
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics