Java基础-泛型

泛型 Generic


泛型机制(generic mechanism)

1.what:

如果除去对象的基本数据类型外,实现方法是相同的,那么我们就可以用泛型实现(generic implementation)来描述这种基本功能。

2.why:为什么要有泛型(Generic)?

[外链图片转存失败(img-t5uyUyWC-1565349373722)(为什么需要泛型.png)]

  1. 解决元素存储的安全性问题:编译时检测类型,提高代码的安全性
  2. 解决数据元素获取时,需要类型强转的问题:减少了类型转换的次数,提高了效率
  3. 提高代码的复用性

泛型,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>();//为了提高版本的兼容性,支持该写法,但不建议
View Code

泛型的自定义

1.自定义泛型类

class Mygen<T,U,K...>{
    1.成员属性:T weight;
    2.成员方法:方法中泛型可以应用到参数、返回值
    3.构造器:构造器也是可以应用的
    4.泛型数组:可以声明,但不可以在类型未知的情况下初始化
    静态内容:不能使用泛型
}
View Code

如何确定泛型类的泛型?

  • 当该类创建对象时或被继承时

注意:子类的泛型个数要大于等于父类的泛型个数

2.自定义泛型接口

interface MyInter<T,U>{
    //不能应用在属性上:属性为静态常量,先于泛型被确定前使用
    public U method(T t);//可以应用在方法上
}
View Code

如何确定泛型接口的泛型?

  • 当该接口被实现或被继承时

注意:

  • 不能应用在属性上:接口中所有的属性都是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

原文地址:https://www.cnblogs.com/Ke-Me/p/14266182.html