您的位置:首页 > 其它

泛型

2016-05-25 21:09 204 查看

泛型 Generic

1.集合泛型List<String> list = new ArrayList<String>();ArrayList<E>中的E称为 类型参数变量
ArrayList<Integer>中的Integer称为 实际类型参数整个称为ArrayList<E> 泛型类型整个ArrayList<Integer>称为参数化的类型ParameterizedType
如果两边都有泛型,则要求泛型必须一致,也可以只有一边有而另一边没有
ArrayList<String> list = new ArrayList<Object>();//错误
ArrayList<Object> list = new ArrayList<String>(); //错误

ArrayList<String> list = new ArrayList ();//--考虑兼容1.5之前的老程序,正确
ArrayList list = new ArrayList<String>();//正确


泛型出现的原因:
在没有泛型之前,集合存入的数据类型就会丢失掉,在取出数据时,还要做强制类型转换,会有转换失败的风险,这种风险在编译阶段是不能检查出来的。引入泛型之后,在定义集合的过程中可以指定集合中存储的数据类型,编译阶段就可以检查存入集合中数据的类型。取出数据时也不需要作强转。 泛型擦除:泛型是提供给java编译器使用的,生成class文件中不带有泛型信息,程序运行效率不受到泛型的影响。

2.自定义泛型

方法泛型:定义在方法上的泛型就叫做方法泛型,作用的范围的当前方法内部泛型在使用之前必须先定义<T>,其中的字母可以是任意字母,但是通常使用大写字母可以认为,当方法在被调用到时,虚拟机自动判断出泛型的具体类型.public static <T> void doxx(T t);

类上的泛型:定义在类上的放行叫做类泛型,作用范围是整个类中都可以使用public class GenericDao<T> {}
可以认为,在使用这个类时,就需要指定出泛型的具体类型.如果不明确指定,则泛型是它的上边界类型的.静态方法不能使用类上定义的泛型,如果想使用泛型静态方法必须自己定义泛型

*泛型通配符: 因为泛型没有继承关系,所有当需要用一个泛型引用不同的泛型实现时,泛型中写他们共同的父类是不行的,这时该怎么做呢?引入一个新的概念,叫做泛型通配符?,注意泛型通配符只能用在泛型引用中,用来引用不同的泛型实现,不能出现在实现中.
List<?>list = null;list = new ArrayList<String>();list = new ArrayList<Integer>(); *泛型的边界: 如果没有指定泛型默认可以接受任意的类型,有时希望进一步限制,此时可以使用泛型的边界:<? extends Person>- 用来指定泛型的上边界,使用在泛型的通配符中和泛型定义中,指定具体的泛型实现必须是指定的类或其子类. 好处---获取到泛型的对象时,可以调用上边界的方法. 坏处-----在传入对象时,只能传入null
<? super Person>- 用来指定泛型的下边界,使用在泛型的通配符中,指定具体的泛型实现必须是指定类或其超类. 好处-----可以传入对象时,可以传入下边界的子孙类对象 坏处------获取到泛型对象时,只能调用Object身上的方法 List<? super Person>list2 = null;list2 = new ArrayList<Ani>();list2.add(new Person());list2.add(new Teacher());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: