------------------ <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、
<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
泛型推断: 取类型的最小公倍数;
<T> void add ( T a , T b ) ;
add ( 3 , 5 ) ; -----类型推断---àInteger
add ( 3.5 , 3 ) ; -----类型推断---àNumber
add ( 3 , “abc”) ;- ---类型推断---àObject
反省的语法: 定义泛型变量时,泛型变量只能是应用类型,不能是基本数据类型;
用于放置泛型的类型参数的尖括号<>写入位置:应出现在方法的其他修饰符之后和方法的返回类型之前,
惯例: 类型参数通常用单个大写字母表示。
注意: 只有引用类型才能作为泛型的实际参数;编译器也不允许创建泛型类型的数组、
特别:除了应用泛型时可以使用extends限定符外,在自定义泛型时,也可以使用extends限定符,并且可以用&来指定多个边界。如: <v extends Serializeble& cloneable >
自定义泛型在哪里定义: 普通方法,构造方法和静态方法中都可以,也可以用一个已定义的泛型变量,用于表示异常,称为参数化异常,可以用于方法的throws列表中,但是不能用于catch 子句中,
private static < T extends Exception> void method () throws T {
try {….}catch ( Exception e ) {throw ( T ) e ; };
}
规则: 在泛型中可以同时有多个类型参数,在定义他们的<>中用逗号分隔,
泛型<T>不能执行加法操作,不是任何类型都支持都支持加法操作,实现不了。
泛型方法练习 :
1编写一个泛型方法,自动将object类型的对象转换成其他类型
public < T > auto ( object obj ) {
return ( T ) obj ;
}
泛型方法调用: Object b=”abcd”;
String b= auto ( b ) ;
//通过返回泛型的接收类型来确定泛型类型
2定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象
Public < T > void auto ( T [] arr , T obj ) {
for ( int i=0 ;i<arr.length() ; i++ ) {
arr[ i ]=obj ;
}
}
3采用自定义泛型方法的方式打印出任意参数化类型的集合的所有内容
Public < T > void auto (Collection< T > ts ) {
for ( T obj : ts ) {
sop( obj ) ;
}
}
4定义两个方法,把任意参数类型的数组(方法1)或集合(方法2)安全复制到另一个数组中;
Pubilc <T> void copy1( T [ ] dest ,T [ ] src ) { }
Public <T> void copy2(Collection<T> dest , T [ ] src ) { }
自定义方法调用: copy1( new Date[10] , new String[10] ) ; //ok 类型推断最小公倍数Object
copy2( new Vector<String> ,new String[10] ) ; //ok 同为String
copy2( new Vector<Date> ,newString[10] ) ; //no ok 同为Date才行,泛型指定为
Date,具有传染性,后面的数组只能是Date类型,类型推断失效。
泛型类型推断规则总结:
1返回值与参数只有一处应用了泛型,那么根据调用方法时该处的实际应用类型来确定,即直接根据调用方法是传入的参数类型或返回值类型来决定泛型参数类型。
2,返回值与参数库应用了泛型,如果调用方法时实际传入类型彼此不同,只是优先考虑返回值类型为参数的类型。
3只有参数应用了泛型,且多个参数的类型彼此不同,这时取多个参数中的做小公倍数类型
自定义泛型类;
dao类----àdata access object------à用于数据访问的对象
c r u d (c创建r查找 u更新 d 删除)增删改查;
daol类即对某个实体类进行crud操作的工具类,通过将dao类定义为泛型类,可以实现对不同实体类的同质化操作(及创建此工具类对象时泛型中指定什么实体类,则这个工具对象指对此种实体类操作)
泛型类定义时,泛型变量在类定义上进行定义说明,成为类级别的泛型类
public class MyDao<T>{
private T field1;
private int ID;
public void set( T obj ) { …..}
public T get ( int ID ) { …..}
}
一个类级别的泛型类型变量只能被实例变量和方法调用(非静态方法)。不能被静态变量和静态方法调用,因为静态成员是被所有参数化的类所共享,所以静态成员不应该有类级别的类型参数,静态方法要用泛型需在方法上自行定义自己的泛型,不是类上定义
------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、
<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------