黑马程序员_java基础加强之泛型

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

泛型(JDK1.5新增)

泛型可以定义在类上,也可以定义在方法上。
定义在类上,传入的对象都将固定,方法对其操作都是同一类型
泛型定义在方法上,方法对任意对象都能操作。
泛型可以同时定义类上和方法上
特殊之处是静态方法不能访问类上定义上的泛型。如果静态方法操作的数据类型不确定时。可以在该方法上定义泛型

泛型在编译后是会被除去的,即会去掉类型信息

 

泛型是给编译器看的,在运用反射后得到class文件后,得到某些方法可以增加其他类型的成员

 

Vector<String> v = newVector<Object>() //错误,不写object也行,写了就会错误

Vector<Object> v = newVector<String>()//错误,泛型不考虑继承关系

 

创建数组实例时。数组的元素不能使用参数化的类型,例如下面错误语句

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

 

以下不会报错

Vector v1 = new Vector<String>();

Vector<Object> v = v1 ;

编译器是不考虑运行时,所以都不会报错

 

<?> ?泛型通配符

使用泛型通配符后不能使用与类型有关的特殊方法

Public static voidprintCollection(Collection<?> collection){
       //可以使用和Collection本有方法
        collection.size();
        for(objectobj:collection){
       	       system.out.prinln(obj);
	}
}	


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

 

自定义泛型:

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


 

泛型的类型只能是引用类型,不能是实际类型。

 

通配符比泛型方法更有效。但是使用泛型可以使用某些使用通配符时不能使用的方法。

 

泛型可以通过返回类型确定,可以通过参数类型确定

private static <T> T autoConvert(T obj){
        return (T) obj;


}//根据返回类型定制泛型转换

 

泛型类 的类

public class GenericDao <T>{
 
    public  void add(T x){
       
    }
   
    public  T getById(int i){
        return null;
    }
}


 

类中的各种方法统一为T类型,T类型即是泛型

 

要通过反射方法得到泛型的实际类型比较麻烦,没法直接通过class类得到,需要通过使用该泛型类的方法来得到该类型的实际类型

1--首先的到使用该泛型的方法Method

2--再通过方法method 的getGenericParameterTypes()得到参数类型Type[]

3--接着对type[]使用实现其接口的子接口ParameterizedType中的方法getRawType()得到声明该类型时的父类型Type[]数组,使用getActualTypeArguments()得到此类型实际类型参数Type[]数组


如何通过反射得到集合的实际类型?

由于编译器在编译后, 所有的集合类型实际类型都会被抹茶,所以,只有通过使用过该集合元素的方法得到实际的类型:

Menthod 的方法 getGenericParameterTypes()  返回值为Type[]

package com.itheima.day1;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Date;
import java.util.List;


public class ReflectFX {

	public static void main(String[] args) throws Exception {
		
		//通过反射得到一个使用过集合的方法
		Method refleMethod = ReflectFX.class.getMethod("applyVector", List.class);
		
		//通过方法的getGenericParameter,Types按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。法
		Type[] types = refleMethod.getGenericParameterTypes();
		
		//ParameterizedType 表示参数化类型,不过明明是接口为什么能使用强制转换?
		ParameterizedType pType = (ParameterizedType)types[0];
		
		//getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。
		System.out.println(pType.getActualTypeArguments()[0]);
	}

	public static <T> void applyVector(List<Date> v1){
		
	}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值