2017-9-5-Java 泛型

Java 泛型学习

泛型可以解决数据类型的安全性问题。

简单泛型类

泛型方法

在一个普通类中定义一个泛型方法

类型变量的限定

类或者方法对类型变量加以约束
例如

public <T extends Comparable>

意思是将泛型参数T限制为Comparable

Java虚拟机中泛型转换小结

  • 虚拟机中没有泛型,只有普通的类和方法
  • 所有的类型参数都会被其限定类型替换
  • 桥方法被合成来保持多态
  • 为保持类型安全性,必要时插入强制类型转换

泛型的安全性警告

在实例化泛型类时,如果未指定一个具体的类型参数,会提示一个不安全操作的unchecked警告信息, 但是并不会影响使用

Java泛型的约束和局限

  • 在泛型操作中子类的泛型类型是不能用父类的泛型类型来接收的。
  • 不能用基本类型实例化类型参数,即类型参数不能为8种基本数据类型,可以使用其对应的包装类来完成。
  • 运行时类型查询只适用于原始类型,因为运行时类型擦除,虚拟机中所有的类型查询只会产生原始类型。
  • 不能创建参数化类型的数组,即不支持泛型数组。
  • varargs警告
  • 不能实例化类型变量
  • 不能在静态域或者方法中引用类型变量
  • 不能捕获或者抛出泛型类对象, 泛型类不能继承Throwable,在编译时期就会报错。
  • 类型擦除后的冲突

泛型类型的继承规则

通配符类型

子类型限定通配符

例如

public void printBuddies(SimpleGenerics<? extends Employee> p)

参数p类型都是Employee的子类限定, 泛型操作设置为一个对象的范围上限。范型上限使用extends关键字声明,表示泛型的类型可能是所指定的类型或者是此类型的子类。

超类型限定通配符

例如

public void printBuddies(SimpleGenerics<? super Employee> p)

参数p类型都是Employee的超类限定,即表示的是任何被Employee继承的类。
泛型下限使用super进行声明,表示泛型的类型可能是所指定的类型,或者是此类型的父类型,或是Object(Object的是所有对象的超类)。

无限定通配符

可以匹配任意泛型对象

public void printBuddies(SimpleGenerics<?> p)

通配符捕获

泛型接口

不仅可以声明一个泛型类,也可以声明一个泛型接口,使用方式与之前相同。

泛型接口子类实现的两种方式

  • 在子类的定义上声明泛型类型,此时子类仍然是一个泛型类
  • 直接在接口中指定具体的类型,此时子类使用时不需要再指定泛型,因为声明子类时已经明确地指定了具体类型。
posted @ 2017-11-04 18:17  寒来袖间  阅读(140)  评论(0编辑  收藏  举报