Java基础-泛型
泛型 Generic
泛型机制(generic mechanism)
1.what:
如果除去对象的基本数据类型外,实现方法是相同的,那么我们就可以用泛型实现(generic implementation)来描述这种基本功能。
2.why:为什么要有泛型(Generic)?
- 解决元素存储的安全性问题:编译时检测类型,提高代码的安全性
- 解决数据元素获取时,需要类型强转的问题:减少了类型转换的次数,提高了效率
- 提高代码的复用性
泛型,JDK1.5新加入,解决数据类型的安全性问题,其主要原理是:
- 在类声明时通过一个标识,表示类中某个属性的类型或者是某个方法的返回值及参数类型。
- 这样在类声明或实例化时,只要指定好需要的具体的类型即可。
Java泛型可以保证:
- 如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。
- 在编译时而不是在运行时检测错误。
- 同时,代码更加简洁、健壮。
3.how:
泛型擦除:编译时将泛型转换为对应类型
泛型的使用语法
List<String> list = new ArrayList<>();//jdk7出现的新特性 List<String> list = new ArrayList<String>(); List<String> list = new ArrayList();//为了提高版本的兼容性,支持该写法,但不建议 List list = new ArrayList<String>();//为了提高版本的兼容性,支持该写法,但不建议
泛型的自定义
1.自定义泛型类
class Mygen<T,U,K...>{ 1.成员属性:T weight; 2.成员方法:方法中泛型可以应用到参数、返回值 3.构造器:构造器也是可以应用的 4.泛型数组:可以声明,但不可以在类型未知的情况下初始化 静态内容:不能使用泛型 }
如何确定泛型类的泛型?
- 当该类创建对象时或被继承时
注意:子类的泛型个数要大于等于父类的泛型个数
2.自定义泛型接口
interface MyInter<T,U>{ //不能应用在属性上:属性为静态常量,先于泛型被确定前使用 public U method(T t);//可以应用在方法上 }
如何确定泛型接口的泛型?
- 当该接口被实现或被继承时
注意:
- 不能应用在属性上:接口中所有的属性都是public static final的,而泛型类型是非静态的
- 实现类的泛型个数要大于等于父接口的泛型个数
- 实现类如果实现多个接口,那么实现类的泛型个数要大于等于所有接口的泛型个数
- 如果多个接口中存在相同的方法,泛型参数不能作为重载的参数条件()
3.自定义泛型方法
public<A> void fun(A a){ //方法体 }
如何确定泛型方法的泛型?
- 当该方法被调用传参时
4.通配符
作用在形参上:
- <?> :可以接收任意类型的泛型
- <? extends XX>:支持XX类型或XX的子类,规定了泛型的上限
- <? super XX>:支持XX类型或XX的父类,规定了泛型的下限
例如:
- <? extends Animal> 可以接受Animal类型以及其所有子类类型
- <? super Dog> 可以接收Dog类型以及其以上所有级别类型
转自https://blog.csdn.net/select_alter_drop/article/details/98980154