---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
泛型类
在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。
声明带泛型的类:
class类名<泛型类型1,泛型类型2……>{
泛型类型 变量名;
泛型类型 方法名(){}
返回值类型方法名(泛型类型 变量名){}
}
使用带泛型的类:
类名<具体类> 对象名 = new 类名<具体类>();
类型参数规范:推荐使用规范-常见的泛型,泛型只保存在源文件中,class文件中不存在;也就是说在编译阶段就会丢失,基本数据类型不能作为泛型类型;
class Point<T>{
//T可以是任何引用类型
private T t1;
private T t2;
public T getT1() {
return t1;
}
public void setT1(T t1) {
this.t1 = t1;
}
public T getT2() {
return t2;
}
public void setT2(T t2) {
this.t2 = t2;
}
}
泛型的限定:
? extends E: 接收E类型或者E的子类型对象。上限
一般存储对象的时候用。比如 添加元素 addAll.
? super E: 接收E类型或者E的父类型对象。 下限。
一般取出对象的时候用。比如比较器。
泛型接口
java5后,可以声明泛型接口,声明方式和声明泛型类是一样的。
publicinterface IDAO<T>{}
泛型接口子类有两种方式:
直接在子类后申明泛型;
在子类实现的接口中给出具体的泛型类型
publicclass DaoImpl<T> implements IDAO<T>{}
publicclass DaoImpl implements IDAO<String>{}
泛型方法
方法中可定义泛型参数,形参的参数类型就是实参的类型。
格式:
<泛型标签> 返回值类型 方法名([泛型标签 参数]...)
publicstatic <T extends Number> List<T> show(T……t){
return null;
}
.....main.....{
//Show(new Object[]{});不可以,因为方法参数类型的限定
Show(new Number[]{});
Show(new Integer[]{});
更新:
public class Demo2<T> {//类级别泛型,以此类对象为参数的方法 在调用方法时传入的参数必须都是此类对象变量
private T t;
public void add(T t){
this.t=t;
}
public T show(){
return t;
}
public <E>void jian(E e){
}
public static void ha(T t){
//错误的 类级别的泛型只能被实例对象调用
}
public static <V> void ha(V t){
//方法级别的泛型 此级别跟类级别的泛型没关系
}
}
通过反射获取方法中的参数的泛型类型
public class Demo {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
Method method=Demo.class.getMethod("add", ArrayList.class);
Type[]type= method.getGenericParameterTypes();
ParameterizedType parType=(ParameterizedType)type[0];
System.out.println(parType.getActualTypeArguments()[0]);//表示参数泛型类型 数组 因为不确定泛型类型个数
System.out.println(parType.getRawType());//参数的类型
}
public static void add(ArrayList<String> e) throws NoSuchMethodException, SecurityException {
}
}