A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 敷衍ゝ微笑掩盖 初级黑马   /  2014-7-2 09:23  /  1240 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ---------
33.泛型应用
① 定义泛型方法。
泛型中的实际类型只能是对象那种类型不能是基本类型。
Add(2,5);
Number x1 = Add(3.5, 6);//取3.5和6的交际Number
Object x2= Add(3, “dsffds”); 取3,“dsffds”的交际Object。
Private static<T> T void add(T x , T y){
Return null;
}

Swap( new String[]{“abc”, “abd”, “ads”});
Swap( new int[]{1,4,5};//错误,Swap中的T不能被int替换,T只能是对象类型。为什么该方法不像上面Add(2,5);那样自动装箱呢,因为int[]本身就是对象类型,也许你要的就是这样的类型呢,也许就弄巧成拙了。

Static<T> T void swap(T[] a, int i , int j){
T  t;
t = a[i];
a[i]=a[j];
a[j]=t;
}
Static<T extends Number> T void swap(T[] a, int i , int j){
T  t;
t = a[i];
a[i]=a[j];
a[j]=t;
}
② 根据调用泛型方法时实际传递的参数类型和返回值的类型来推断,具体规则如下:
当某个类变量只在参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时该处的实际应用类型来确定,这很容易凭着感觉推断出来,即直接根基调用方法时传递的参数类型活返回值来决定泛型参数的类型。 例如:
Swap(new String[3], 3, 5)   static<T>void swap(T[] a, int i ,int j)
当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时,这多处的实际应用类型都对应同一种类型来确定,这很容易凭着感觉推断出来,例如:
Add(3,5)    static<T> T void add(T x , T y)
当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应了不同的类型,且没有使用返回值,这时候取多个参数中的最大交集类型。例如,下面语句实际对应的类型就是Number了,编译没问题,只是运行时出错:
fill(new Integer[3], 3.5f)  static <T>void fill(T[] a , T b);
当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应到了不同的类型,并且使用返回值,这时候优先考虑返回值的类型,例如:下面语句实际应用的类型就是Integer了,编译将将报道错误,将变量x的类型改为float,对比eclipse报告的错误提示,接着再将变量类型x类型改为Number,则没有了错误:
Int x =(3,4.4f)     static<T> add(T a, T b)
参数类型的类型推断具有传递性,下面第一种情况推断实际参数类型为Object,编译没问题,而第二种情况则根据参数化的vector类实例将类型变量直接确定为String类型,编译将出现问题:
Copy(new Integer[5], new String[5])   static <T> void copy(T[]a, T[] b);

③ 定义泛型类的实例对象中的多处都要用到同一个泛型参数,即这些方法引用的泛型类型要保持同一个实际类型时,这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型语法格式如下:
如果类的
Public class GenericDao<T>{
Private T field;
Public void save(T obj){}
Public T getById(int id){}
}
创建方式为:GenericDao<String> dao=new GenericDao<String>();
注意:在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
      当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),不能被静态变量和静态方法调用。因为静态成员是被所有参数化的类共享的,所以静态成员不应该有类级别的类型参数。
④ 通过反射获得泛型的实际类型参数。
Public class GeneriticTest{
//  想得到Vector<Date>中的实际类型参数
Public void abc(){
Method applyMethod = GenericTest.clas.getMethod(“applyVector”, Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();//返回该方法所用的形参类型
ParameterizedType pType =(ParameterizedType ) types[0];
System.out.println(pType.getActualTypeArguments()[0]);// 返回表示此类型实际类型参数的 Type 对象的数组。

}
Public static void applyVector(Vector<Date> v1){}
}

评分

参与人数 1黑马币 +3 收起 理由
菜小徐 + 3

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马