java日常学习:泛型

java代码块


泛型

泛型是jdk1.5出现的新特性。

泛型的好处:
1. 可以把运行时出现的问题提前至编译时。
2. 避免了无谓的强制类型转换。

判断一下那种写法是正确的:
ArrayList list = new ArrayList(); true

ArrayList<Object>  list = new ArrayList<String>();  false
ArrayList<String>  list = new ArrayList<Object>();  false

// 为了新老系统的兼用性
ArrayList list = new ArrayList(); true
ArrayList list = new ArrayList(); true

使用泛型要注意的事项:
1. 泛型中没有多态的概念,左右两边的数据类型必须要一致,或者是只写一边的泛型。

推荐使用: 两边都写上同样数据类型的泛型。
自定义泛型:自定义泛型可以理解为是一个数据类型的变量或者是一个数据类型的占位符。

函数自定义泛型的格式:

修饰符  <声明自定义泛型>  返回值类型   函数名(形参列表 ...){

}

函数自定义泛型要注意的细节:
1. 函数上自定义泛型的具体数据类型是在调用该函数的时候,传递实参数据的时候确定具体的数据类型 的。
2. 自定义泛型使用的标识符可以自定义的,只要符合标识符的命名规则即可。但是一般自定义泛型使用的标识符都是单个字母而已。

泛型中是不能使用基本数据类型数据的,如果需要使用基本数据类型数据,那么就要使用基本数据类型对应 的包装类型

int -----> Integer
float---->Float
double --- Double 
char -----> Character
boolean ---- Boolean
byte-----Byte
short ---Short
long ----- Long 

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

泛型接口:

泛型接口的定义格式:

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

}

泛型接口要注意的细节:
1. 接口上自定义泛型的具体数据类型是在实现该接口的时候确定 的。
2. 如果一个接口已经自定义了泛型,在实现该接口的时候没有指定自定义泛型的具体数据类型,那么默认为Object类型。

泛型的上下限:

需求1: 定义一个方法可以接受任意类型的集合对象, 接收的集合对象只能存储Integer以及Integer父类类型的数据。

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

泛型的通配符: ?

? super Integer  泛型的下限   只能用于Integer或者是Integer的父类类型数据 

? extends Number  泛型的上限  只能用于Number或者是Number的子类类型数据。

练习一

package day06;

//需求:自己定义一个工具类,实现数组内元素的反转和输出
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 stringBuilder = new StringBuilder();
        for (int i=0;i<arr.length;i++) {
            if(i==0) {
                stringBuilder.append("["+arr[i]+",");
            }else if(i==arr.length-1){
                stringBuilder.append(arr[i]+"]");
            }else {
                stringBuilder.append(arr[i]+",");
            }

        }
        return stringBuilder.toString();
    }
}




public class Demo1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer[] integer = {1,2,3,4,5,6,7,8,9};
        MyArrays tool = new MyArrays();
        tool.reverse(integer);
        System.out.println("反转后的元素是:"+tool.toString(integer));
    }

}

练习二

public class Demo5 {

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

//      print(list2);

        show(list);
        show(list3);
    }

    // 需求2: 定义一个方法可以接受任意类型的集合对象, 接收的集合对象只能存储Number或者Number子类类型的数据。
    public static void  show(Collection<? extends Number> c){


    }

    //需求1: 定义一个方法可以接受任意类型的集合对象, 接收的集合对象只能存储Integer以及Integer父类类型的数据。
    public static  void print(Collection<? super Integer> c){

    }

}

用于平时自己复习回顾,如有错误,欢迎指正

个人微信号:yxx85561498,欢迎一起学习交流,努力进步

微信二维码

猜你喜欢

转载自blog.csdn.net/yan_star/article/details/78635244