a:定义格式:
public interface MyInterface<T> {
//泛型作为参数
void method1(T t);
//泛型作为返回值类型
T method2();
//泛型作为参数和返回值类型
T method3(T t);
}
b:泛型类型确定时期:
//当一个实现类实现该接口时直接确定类型
public class MyInterfaceImpl1 implements MyInterface<String>{
@Override
public void method1(String s) {
}
@Override
public String method2() {
return null;
}
@Override
public String method3(String s) {
return null;
}
}
//实现类实现该接口时不确定类型,而是创建该实现类对象时才确定
public class MyInterfaceImpl2<T> implements MyInterface<T>{
@Override
public void method1(T t) {
}
@Override
public T method2() {
return null;
}
@Override
public T method3(T t) {
return null;
}
}
2.2:泛型类
定义格式:
public class Factory<E> {
public <E> T fixAll(E e) {
System.out.println("修理了任意物品");
return e;
}
}
泛型类型确定时期:
在创建对象的时候,比如:ArrayList<String> list = new ArrayList();
2.3:泛型方法
代码:
public class Factory<E> {
public E fix(T o) {
System.out.println("修理了物品");
return o;
}
}
确定泛型的时候:
在方法的调用时候。
三:泛型的通配符
3.1:通配符的使用
实例:
ArrayList<Person> people = new ArrayList<>();
printArrayList(people);
ArrayList<Student> students = new ArrayList<>();
printArrayList(students);
//?不能用T来替换。因为没有这种泛型得定义格式。编译通不过。
private static void printArrayList(ArrayList<?> students) {
for (Object student : students) {
System.out.println(student);
}
}
解释:
能够装任意类型的泛型。
3.2:通配符的上下限
格式:
<? extends B> :泛型的类型只能是B类型或者B类型的子类;上限
<? super B> : 泛型的类型只能是B类型或者B类型的父类;下限