泛型类/接口
格式:
【修饰符】 class/interface 类名/接口名<泛型形参 extends 泛型形参父类>{
}
- 泛型形参 必须<=泛型形参父类
- 泛型类中或泛型接口的泛型形参,不能用于声明静态方法或静态变量
泛型实参的要求
- 泛型实参不能是基本数据类型,只能是引用数据类型
设定泛型形参的上限:
- <T extends 父接口上限> ex:
泛型方法
某些特殊情况下:需要单独声明泛型方法
- 静态方成员上,不能使用泛型类或泛型接口上的泛型形参的
- 类中某个方法需要用到泛型,但是类不是泛型类,泛型接口
语法格式
【修饰符】<泛型形参列表> 返回值类型 方法名 (【形参列表】) 【throws 形参列表】
其他
数组工具类:java.util.Arrays
import java.util.Arrays;
public class TestGenericMethodUse {
public static void main(String[] args) {
java.util.List<String> asList = Arrays.asList("hello","world","java");
asList.add("123");//asList的数组为只读数组,不能改变,会抛出异常
for (String string : asList) {
System.out.println(string);
}
}
}
泛型的上限
class Student<T extends number>{}
- 定义上限后,只能是父类本身或其子类
定义多个上限: class student<T extends number & java.io.Serializable>
- 为类型形参指定上限:必须在类上限第一位
设定泛型形参的上限
public static <T extends Graphic> void printArea(List<T> graphics){}
类型通配符:
在声明方法时,又不确认方法的实际类型,可以使用通配符
public static void test(List<?> c,String str){}
泛型与通配符的区别:
在不添加元素到结合中时,两个效果相同,通配符不支持集合添加元素
设定通配符的下限
public static <T> void copy(Collection<T> dest,Collection<? extends T> src){}
<? super Type>,这个通配符表示它必须是Type本身或是Type的父类
- 泛型方法不支持方法重载
- instanceof后面不支持泛型
- 泛型不支持创建数组对象
- try…catch 后不能使用泛型表示
泛型擦除
默认是该类型形参的第一个上限(如果没有上限,默认就是Object)。
Collections工具类
boolean addAll(Collection<? super T>c, T...elements)
public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)
public static <T> void copy(List<? super T> dest, List<? extends T> src)
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
public static <T> void sort(List<T> list, Comparator<? super T> c)
public static <T extends Comparable<? super T>> void sort(List<T> list)
synchronized开头的方法:可以让线程不安全的方法变为线程安全的方法
unmodifiable开头的方法:表示把一个可变集合变为只读集合