泛型

泛型

泛型:是JDK5中引入的特性,它提供了编译时安全检测机制,该机制允许在编译时检测到非法的类型,它的本质是参数化类型

顾名思义,就是将类型由原来的具体类型参数化,然后再使用/调用时传入具体的类型

这种类型可以在类、方法和接口中,被称为泛型类,泛型方法和泛型接口

泛型定义格式:
  • <类型>:指定一种类型的格式。这里的类型可以看作是形参
  • <类型1,类型2>指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参
  • 将来具体调用使用给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
泛型的好处
  • 把运行时期的问题提前到了编译期间
  • 避免了强制类型转换

Generic英文释义:通用的,一般的


泛型类

泛型类的定义格式

  • 格式:修饰符class类名<类型>{ }

  • 范例:public class Generic{ }

注:此处的T可以为任意标识,常用的有T、E、K、V来表示泛型

在使用类名实例化对象时,就可以在<>内规定数据类型(引用类型),类中属性类型将与<>内所写类型一致

泛型类中,可以定义返回值为泛型的方法和变量,这些方法和变量的类型在泛型类被实例化时确定


泛型方法

泛型方法的定义格式:

  • 格式:修饰符<类型>返回值类型 方法名(形参){ }
  • 范例:public void show(T t){ }

注:方法的返回值也可以为泛型,类为泛型类即可


泛型接口

泛型接口的定义格式:

  • 格式:修饰符 interface 接口名<类型>{ }
  • 范例:public interface Generic{ }

泛型接口的实现类一般时泛型类,其用法与泛型类相同


类型通配符

为了表示各种泛型List的父类,可以使用类型通配符

  • 类型通配符<?>
  • List<?>:表示元素类型位置的List,他的元素可以匹配任何的类型
  • 这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中

如果是我们不希望List<?>时任何泛型的父类,只希望它表示某一类泛型的父类,可以使用类型通配符的上限

  • 类型通配符的上限:<?extends 类型>
  • List<?extends Number>:他表示的类型是Number及子类

除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限

  • 类型通配符下限:<?super 类型>

  • List<?super Number>:他表示的类型是Number及父类

public class Generic {
    public static void main(String[] args) {
        List<?> list1 = new ArrayList<Object>();
        List<?> list2 = new ArrayList<Number>();
        List<?> list3 = new ArrayList<Integer>();
        System.out.println("==================");
        //类型通配符上限,类型标示为Number及子类
//        List<? extends  Number> list4 = new ArrayList<Object>(); 报错 因为Object是Number的父类
        List<? extends  Number> list5 = new ArrayList<Number>();
        List<? extends  Number> list6 = new ArrayList<Integer>();
        System.out.println("==================");
        //类型通配符上限,类型标示为Number及父类
        List<? super Number> list7 = new ArrayList<Object>();
        List<? super Number> list8 = new ArrayList<Number>();
//        List<? super Number> list9 = new ArrayList<Integer>();报错 因为Integer是Number的子类
    }
}

可变参数

可参考数组笔记,这里着重记录主要使用方法

Arrays工具类中有一个静态方法

  • public static List asList(T... a):返回由指定数组支持的固定大小的列表

List接口中有一个静态方法

  • public static List of(E... Elements):返回包含任意数量元素的不可变列表

Set接口中有一个静态方法

  • Public Static Set of(E... Elements):返回包含任意数量元素的不可变集合

总结:三者都不能增加删除元素,Array可以更改元素,Set不能出现重复元素