泛型
是jdk5中引入的特性,提供了编译时类型的安全监测机制,允许在编译时检测到非法的类型,本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
参数化类型,就是将原来具体的类型参数化,在使用或者调用的时候调如具体的类型
这种参数类型可在类、方法和接口中,分别称为泛型类、泛型方法和泛型接口
定义格式
<类型>:指定一种类型的格式。这里的类型可以看做形参
指定多种类型的格式:
<类型1,类型2,类型3>
将具体调用时给定的类型看做实参,并且实参只能是引用数据类型
好处
- 把运行时的问题提前到了编译期间
- 避免了强制类型转换
泛型类
格式:
修饰符 class 类名<类型> {}
public class Generic<T>{}
这里的T是任意的,常见的T、E、K、V等形式的参数常用于表示泛型
泛型方法
public class Generic{
public<T> show(T t){
System.out.println(t);
}
}
泛型接口
public interface Generic<T>{
void show(T t);
}
类型通配符
-
为了表示各种泛型List的父类,使用类型通配符
<?> -
List<?>:表示元素类型未知的List,它的元素可以匹配任何的类型,不能吧元素添加到其中
-
如果说我们不希望List<?>是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配符的上限==<?extends 类型>==
如:List<? extends Number>:表示的类型是Number或者其子类型 -
还可以用类型通配符指定下限<?super类型>
List<?super Number>:表示的类型是Number或者其父类
可变参数
可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
public void method(int... a){
}
a实际是个数组
多个参数,可变参数放后面
方法 | 特点 |
---|---|
List.asList(T… t) | 不支持增删 |
List.of(T… t) | 不支持增删改 |
Set.of(T… t) | 不支持增删,没有修改,不能给重复元素 |