Java学习笔记

泛型的功能与使用

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;
上一篇 下一篇

猜你喜欢

热点阅读