目录
泛型机制:
- 1、泛型这种语法机制,只在程序编译阶段起作用,只是在编译器参考的。(运行阶段泛型没用)
- 2、使用了泛型好处是什么?
- 第一:集合中存储的元素类型统一了。
- 第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的向下转型。
- 第三:提高效率
- 第四:不再提示编译警告
- 3、泛型的缺点是什么?
- 导致集合中存储的元素缺乏多样性!
- 4、可以自定义泛型。
- 自定义泛型的时候,<>括号中的是一个标识符,随便写。
- 一般用E和T。
对于泛型的理解:
- 1、泛型又称为参数化类型,是JDK5.0出现的新特性,解决数据类型的安全性问题
- 2、在类声明或实例化时只要指定好需要的具体的类型即可
- 3、Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCaseException
- 4、可以在类声明时,通过一个标识表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型
- 泛型使用时的细节:
- 1、只能是引用数据类型
- 2、在给泛型制定具体类型后,可以传入该类型或者其子类型
- 3、推荐写法:List<String> list = ArrayList<>(); // 后面菱形可以空着
- 4、如果不指定泛型,默认泛型就是Object
自定义泛型注意细节:
1、普通成员可以使用泛型
2、使用泛型的数据,不能初始化 因为数组在new 不能确定类型 就无法在内存开空间
3、静态方法中不能使用类的泛型
因为静态和类相关的,在类加载中,对象还没有创建
所以,静态方法和静态属性使用了泛型,JVM就无法完成初始化
4、泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
5、如果在创建对象时,没有指定类型,默认为Object
自定义泛型接口:
1、接口中,静态成员也不能使用泛型
2、泛型接口的类型,在继承接口或者实现接口时确定
3、没有指定类型,默认为Object
4、实现接口时,可以直接指定泛型接口的类型
自定义泛型方法
1、语法 : public <T,E…..> 返回类型 方法名 (参数列表){}
2、泛型方法 ,可以定义在普通类中,也可以定义在泛型类中
3、当泛型方法被调用时,类型会确定
4、public void eat(E e){} 修饰符后没有<T,E…> eat方法不是泛型方法,而是使用了泛型
泛型不具备继承性
List<Object> list = new ArrayList<String>(); //没有这种语法
2、<?> : 支持任意泛型类型
3、<? extends A> : 支持A类以及A类的子类,规定了泛型的上限
4、<? super A> : 支持A类以及A类的父类,不限于直接父类,规定了泛型的下限