泛型的功能与使用
2017-08-07 本文已影响18人
蜗先生
1.泛型的功能
我们知道数组是存储相同类型的变量,集合可以存储不同类型的变量,正是因为存储不同类型容易在运行时出现ClassCastException(类型转换异常),且在编译时无提醒,例如
List list = new ArrayList( );
String str = (String)list.get(0);//运行时ClassCastException
因此jdk5引入了泛型的概念,保证了类型的转换不正确在编译时不通过,使异常不会保留到运行时。泛型只是在编译时的检查使用,运行时会把泛型擦除。
List<Integer> list = new ArrayList<Integer>( );
String str = (String)list.get(0);//编译不通过,不能将Integer转换成String
当然泛型的使用不只是在集合中,自定义的类也可以使用泛型。
2.泛型的使用
1)泛型类
修饰符 Class/Interface 类名或接口名<泛型符号>{ }
类中的属性和方法都可以把泛型符号当做类使用。
2)泛型方法
修饰符 <泛型符号> 返回值 方法名(类型 形参){ }
方法中的返回值,形参类型可以使用泛型。
3.泛型中的通配符
面向对象的三大特性:封装、继承、多态,多态是向上转型实现的,向上转型又必须是继承关系,但是集合中的List<Number>不是List<Integer>的父类,那么就不能用下列代码
LIst<Integer> list = new ArrayList<Integer>( );
List<Number> list2 = list;//编译不通过
因此引入通配符,充当某一个或一些类的父类,保证了上面的转换可以实现。
1)? 任意类型
?可以充当任意类型的父类,不能是Object,如果下面这样写会编译不通过
List<Object> list = new ArrayList<Integer>( );
//编译不通过,不能将ArrayList<Integer>类型转换成 List<Object>
可以这样写
LIst<Integer> list = new ArrayList<Integer>( );
List<?> list2 = list;
2)? extends A A及其所有子类
? extends A可以充当A及其所有子类的父类,不能是A,同上编译不通过
可以这样写
LIst<Integer> list = new ArrayList<Integer>( );
List<? extends Number> list2 = list;
3)? super B B及其所有父类
? extends B 可以充当B及其所有父类的父类,不能是B,同上编译不通过
可以这样写
LIst<Integer> list = new ArrayList<Integer>( );
List<? super Integer> list2 = list;