泛型

定义:

  类型由原来的具体的类型变为未知的类型,约束类型的定义的类编写时确定变为声明类的时候确定.

理解:

  统一数据类型却不固定数据类型,只作用在代码编译阶段.

产生原因:

  控制传入数据类型的一致性,但又不固定传入的类型

泛型的可用位置:

1,泛型接口 2,泛型类 3,泛型方法

案例:

package fx;

import java.util.ArrayList;
import java.util.List;

public class GenericTest {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("qq");
        list.add("weixin");
        list.add(100);
        for(int i=0;i<list.size();i++){
            String name = (String)list.get(i);//第三次转型报错java.lang.ClassCastException
            System.out.println("name:"+name);
        }
    }
}

由上例子中可以看出,没有泛型的不安全,容易造成这样的疏忽.加上泛型以后,编译检查期间就会做类型检查,避免了上述错误.

list.add(100);//编译检查报错

泛型注意事项:

1,没有泛型数组

2,声明时泛型的传入类型不同(List<??>),但生成的对象的类型是相同的(List).

3,声明的对象的泛型不同,要传入统一的接口时,接口定义传入参数需要使用泛型通配符.

例如:

package fx;

import java.util.ArrayList;
import java.util.List;

public class GenericTest2 {
    public static void getData(List<?> list){//不固定泛型的参数
        System.out.println("Data:"+list.getClass());//输出结果不管是什么泛型,都是相同的类型:Data:class java.util.ArrayList
    }
    public static void getDataStr(List<String> list){//固定泛型的参数
        System.out.println("Data:"+list.getClass());
    }
    public static void main(String[] args) {
        List<String> name = new ArrayList<String>();
        List<Integer> age = new ArrayList<Integer>();
        GenericTest2.getDataStr(name);//正常
        GenericTest2.getDataStr(age);//编译检查报错
        GenericTest2.getData(name);//正常
        GenericTest2.getData(age);//正常
    }
}

关于通配符:

上限: List<? extends Number> 表示Number以及子类

下限: List<? super Number> 表示Number以及父类

?: List<?> 表示任意 

原文地址:https://www.cnblogs.com/qinggege/p/5213229.html