一 泛型

泛型是jdk1.5使用的新特性。
泛型的设计初衷为了参数化类型
泛型的好处:
1. 将运行时的异常提前至了编译时。
2. 避免了无谓的强制类型转换 。

常见应用还是几种自定义泛型。
泛型的几种用法
1 方法泛型
2 类泛型
3 接口泛型

二 方法泛型

修饰符 <声明自定义的泛型>返回值类型 函数名(使用自定义泛型 …){
}

public static <abc>abc getData(abc o){
                return o;
    }

需求: 定义一个方法可以接收任意类型的参数,而且返回值类型必须 要与实参的类型一致。

public class Demo2 {

    public static void main(String[] args) {
        String str = getData("abc");
        Integer i = getData(123);
    }
    public static <abc>abc getData(abc o){
        return o;
    }
}

三 自定义类泛型

class 类名<声明自定义泛型>{
}

泛型类要注意的事项:
1. 在类上自定义泛型的具体数据类型是在使用该类的时候创建对象时候确定的。
2. 如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象 的时候没有指定 泛型的具体数据类型,那么默认为Object类型
3.在类上自定义泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型,那么需要在方法上自己声明使用。

class MyArrays<T>{


    //元素翻转
    public void reverse(T[] arr){
        for(int startIndex = 0, endIndex = arr.length-1 ; startIndex<endIndex ; startIndex++,endIndex--){
            T temp  = arr[startIndex];
            arr[startIndex] = arr[endIndex];
            arr[endIndex] = temp;
        }

    }

    //
    public String toString(T[] arr){
        StringBuilder sb = new StringBuilder();
        for(int i = 0 ; i < arr.length ; i++){
            if(i==0){
                sb.append("["+arr[i]+",");
            }else if(i==arr.length-1){
                sb.append(arr[i]+"]");
            }else{
                sb.append(arr[i]+",");
            }
        }
        return sb.toString();
    }
    public static <T>void print(T[] t){
    }
}

四 泛型接口
泛型接口的定义格式:

interface 接口名<声明自定义泛型>{

}

泛型接口要注意的事项:
1. 接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定 的。
2. 在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。
需求: 目前我实现一个接口的时候,我还不明确我目前要操作的数据类型,我要等待创建接口实现类 对象的时候我才能指定泛型的具体数据类型。

如果要延长接口自定义泛型 的具体数据类型,那么格式如下:
格式:  
    public class Demo4<T> implements Dao<T>{

    }

*/

interface Dao<T>{

    public void add(T t);   
}

public class Demo4<T> implements Dao<T> {

    public static void main(String[] args) {
        Demo4<String> d = new Demo4<String>();
    }

    public void add(T t){

    }


}

五 泛型的上下限
/*
泛型的上下限:

需求1: 定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。

需求2: 定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Number或者是Number的子类类型数据。

泛型中通配符: ?

? super Integer : 只能存储Integer或者是Integer父类元素。  泛型 的下限

? extends Number : 只能存储Number或者是Number类型的子类数据。 泛型上限

*/
public class Demo5 {

public static void main(String[] args) {
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    ArrayList<Number> list2 = new ArrayList<Number>();

    HashSet<String> set = new HashSet<String>();
    //getData(set);

}

//泛型的上限
public static void getData(Collection<? extends Number> c){


}

//泛型的下限
public static void print(Collection<? super Integer> c){

}

}