JAVA1.5新特性----泛型Generic

一、泛型是提供给Java编译器使用的,可以限定集合中的输入类型,如定义集合ArrayList

  • ArrayList collection = new ArrayList()
----->此集合中可以添加其它数据类型如Integer,String,Long......
  • ArrayList<Integer> collection1 = new ArrayList<Integer>
----->此集合中只能添加Integer类型数据
如果在collection1中add("abc"),则编译时会报错,通不过。
但如果collection 与collection1 通过编译,则它们的类型是一样的,都是ArrayList类型
  • System.out.println(collection.getClass()== collection1.getClass())
----->返回值是true
通过反射的方法,可以给ArrayList<Integer>类型增加一个String类型的成员,如
  • collection1.getClass().getMethod("add",String.class).invoke(collection1,"abc")
----->往ArrayList<Integer>类型加入String数据
  • System.out.println(collection.get(0))  

----->打印abc

二、使用泛型的特点

  1. ArrayList<Integer>称为参数化类型
  2. ArrayList称为原始类型
参数化类型不考虑类型参数的继承关系
  • Vector<String> v = new Vector<Object>()
----->错误
  • Vector<Object> v = new Vector<String>()
----->也错误


三、泛型中的?通配符

  • public static void printCollection(Collection<?> collection){}
//Collection<?>表示传进来的参数可以是任何参数化类型的Collection


四、泛型中的?通配符的扩展

限定通配符的上边界

  • Vector<? extends Number> v = new Vector<Ingeter>();

----->正确,<? extends Numbe>表示?是Number的子类
限定通配符的下边界

  • Vector<? supper Integer> v = new Vector<Number>();

----->正确,<? supper Integer>表示?是Integer的父类

五、自定义泛型

  • public static <T> void changeT(T x[],int i,int j)

//<T>表示参数类型为T类,传入的参数类型也是T,T代表任意类,不可以是基本数据类型

  • public static <K,V> void change(K key,V value){}  
//<K,V>表示参数有两个类型,中间用“,”隔开


六、实例

  • public static <T> void copy(Collection<T> des,T[] src){
  • for(int i=0;i<src.length;i++){
  • des.add(src[i]);
  • }}

//将数组中的元素拷贝到集合里面去


七、在类定义中应用泛型

  • class GenericDao<T>{
  • public void save(T obj){}
  • public T getById(int id){return null;}
  • }

//在对此泛型类进行参数化时,类型参数的实例必须是引用类型,不能是基本类型

  • GenericDao<String> gd = new GenericDao<String>();

//创建类实例对象

八、用反射的方法获得泛型的类型
Collection<String>与Collection<Integer>在内存中的字节码是一致的,但如何知道一个实例化对象的泛型是String,而不是Integer呢?

  • public void applyVector(Vector<String> str){}
//定义一个方法,传入一个参数化类型,方法存放于People类中
  • Method applyMethod = People.class.getMethod("applyVector", Vector.class);
//用反射的获得该方法
  • applyMethod.getGenericParameterTypes()[0]
//通过Method 类的getGenericParameterTypes()方法来获得传入参数的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值