定义:
类型由原来的具体的类型变为未知的类型,约束类型的定义的类编写时确定变为声明类的时候确定.
理解:
统一数据类型却不固定数据类型,只作用在代码编译阶段.
产生原因:
控制传入数据类型的一致性,但又不固定传入的类型
泛型的可用位置:
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<?> 表示任意