泛型
泛型
泛型:是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不能出现重复元素