黑马程序员--泛型

---------------------- android培训java培训、期待与您交流! ----------------------

泛型

       使用泛型,可以将一个集合中的元素限定为一个特定的类,集合中只能存储痛一个类型的对象,这样更安全;并且从集合中获取一个对象是,编译器可以知道这个对象的类型,可省去强制类型转换。

去类型化,可以使用反射的方式穿透泛型限定,泛型是给编译器看的。

ArrayList<E>泛型类型

ArrayList<Integer>参数化类型,Integer称为类型参数的实例或者实际参数类型

<>念typeof

ArrayList称为原始类型

       参数化类型与原始类型兼容性:

              参数化类型可以引用一个原始类型的对象,编译器报警告

              Collection<String>c = new Vector();

              原始类型也可以引用一个参数化类型的对象,编译器报警告

              Collectionc = new Vector<String>();

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

              Vector<String>v = new Vector<Object>();//错误

              Vector<Object>v = new Vector<String>();//错误

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

              Vector<Integer>vectorList[] = new Vector<Integer>[10];

 

       使用?通配符可以引用其他各种参数化的类型,?通配符第一的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

通配符的扩展

       ?extends Number  任意Number或者Number的子类

       ?super Integer 任意Integer父类 //总是包括自己

 

Map的迭代

       Set<Map.Entry<String, Integer>> entrySet =maps.entrySet();

       for(Map.Entry<String, Integer> entry:entrySet)

           System.out.println(entry.getKey()+":" + entry.getValue());

 

自定义泛型

语法和推断

    privatestatic <T> T add(T x,T y){

       returnnull;

    }  

应用//只有引用类型才可用作为泛型的参数

    privatestatic <T>void swap(T[] a,int i,int j){

       T temp = a[i];

       a[i] = a[j];

       a[j] = temp;

    }

    可用使用限定符

普通方法、构造方法和静态方法中都可用使用泛型。

 

类型参数的推断,返回值前时候用<>说明类型

编译器判断泛型方法的实际类型参数的过程称为类型推断,类型推断是相对于知觉推断的。

更加调用泛型时实际传递的参数类型或返回值的类型来推断

1.             某个类型变量指针整个参数列表中的所有参数和返回值中的一处被应用,那么根据调用方法时该处的实际应用类型来确定,这很容易凭感觉推断出来,即直接根据调用方法时传递的参数类型或返回值来决定泛型参数的类型

swap(new String[3],3,4)-->static<E>void(E[],int i,int j);

2.                当某个类型变量在整个参数列表中的所有参数和返回值中的错处被应用了,如果调用方法时多处的实际应用类型都对同一种类型来确定

add(3,5)-->static<T> T add(T a,T b);

3.                当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时,这多处实际应用类型对应到了不同的类型,且没有使用返回值,这时候取多个参数类型的最大交集

fill(newInteger[3],3.5f)-->static <T> void fill(T[] a, T v)

4.                参数类型的类型推断具有传递性

 

自定义泛型类

       静态方法不能使用泛型类,如果要用需独立使用,可用方法级别的

       多个方法使用,使用类级别的泛型

 

//通过反射方法获取获取参数列表,获取泛型的类型

       Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);

       Type[] types = applyMethod.getGenericParameterTypes();

       ParameterizedType pType = (ParameterizedType) types[0];

       System.out.println(pType.getActualTypeArguments()[0]);

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值