从JDK1.5以后引入了三大常用新特性:泛型、枚举(enum)、注解(Annotation)。其中在JDK1.5中泛型是一件非常重要的实现技术,它可以帮助我们解决程序的参数转换问题。

  1. 泛型指的就是在类定义的时候并不会设置类中的属性或方法中的参数的具体类型,而是在类使用时再进行定义,不能使用基本类型
  2. 泛型类
    如果要想进行这种泛型的操作,就必须做一个类型标记的声明。
    范例:泛型类的基本语法
    尖括号 <> 中的 T 被称作是类型参数,用于指代任何类型。实际上这个T可以任意写,但出于规范的目的,Java还是建议我们用单个大写字母来代表类型参数。常见的如:
    T 代表一般的任何类。
    E 代表 Element 的意思,或者 Exception 异常的意思。
    K 代表 Key 的意思
    V 代表 Value 的意思,通常与 K 一起配合使用。
    S 代表 Subtype 的意思
    泛型的出现彻底改变了向下转型的需求。引入泛型后,如果明确设置了类型,则为设置类型;如果没有设置类型,则默认为Object类型。
  3. 泛型方法
    泛型方法与泛型类稍有不同的地方是,类型参数也就是尖括号那一部分是写在返回值前面、方法修饰符后面的。<>中的 T 被称为类型参数,而方法中的 T 被称为参数化类型,它不是运行时真正的参数; 声明的类型参数,也是可以当作返回值的类型的。如果泛型方法的泛型参数与类型的泛型参数相同,则方法的泛型参数会隐藏外部类型的泛型参数,编译器将产生警告
  4. 泛型类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准。
  5. 泛型接口
interface IMessage<T> {
    public void print(T t);
}
//子类实现接口的时候明确具体类型
class MessageImpl implements IMessage<String> {
//class MessageImpl<T> implements IMessage<T>{
    @Override
    public void print(String t) {
        System.out.println(t);
    }
}

public class TestDemo {
    public static void main(String[] args) {
        IMessage<String> msg = new MessageImpl();
        msg.print("Hello World");
    }
}
  1. 类型擦除
    泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,泛型类和普通类在 java 虚拟机内是没有什么特别的地方。在泛型类被类型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,如 则会被转译成普通的Object 类型,如果指定了上限如 则类型参数就被替换成类型上限。
  2. 通配符
    (1)设置泛型上限<?extends 基类>?限定为指定类或其派生类
    (2)设置泛型下限<?super派生类>?限定为指定类或其基类
    (3)上限可以用在声明,不能修改;而下限只能用在方法参数,可以修改内容。