泛型类
定义泛型类:
public class GenericClass<E> { private E name; public E getName() { return name; } public void setName(E name) { this.name = name; } }
使用泛型类:
//创建GenericClass对象,泛型使用Integer类型 GenericClass<Integer> gc2 = new GenericClass<>(); gc2.setName(1); //创建GenericClass对象,泛型使用String类型 GenericClass<String> gc3 = new GenericClass<>(); gc3.setName("小明");
泛型方法
定义泛型方法:
public class GenericMethod { //定义一个含有泛型的方法 public <M> void method01(M m){ System.out.println(m); } //定义一个含有泛型的静态方法 public static <S> void method02(S s){ System.out.println(s); } }
使用泛型方法:
GenericMethod gm = new GenericMethod(); gm.method01(10); gm.method01("abc"); gm.method01(8.8); gm.method01(true); //静态方法,通过类名.方法名(参数)可以直接使用 GenericMethod.method02("静态方法"); GenericMethod.method02(1);
泛型接口
定义泛型接口:
public interface GenericInterface<I> { public abstract void method(I i); }
使用泛型接口1
public class GenericInterfaceImpl1 implements GenericInterface<String> { @Override public void method(String s) { System.out.println(s); } }
使用泛型接口2
public class GenericInterfaceImpl2<I> implements GenericInterface<I> { @Override public void method(I i) { System.out.println(i); } }
泛型通配符 ?
因为泛型没有继承的概念,所以当一个方法的参数带有泛型时,且该泛型要通配多个类型时,需要使用泛型通配符,相当于Object类型,但因为泛型没有继承的概念,所以用?代替,表示通配任何泛型。
public static void main(String[] args) { ArrayList<Integer> list01 = new ArrayList<>(); list01.add(1); list01.add(2); ArrayList<String> list02 = new ArrayList<>(); list02.add("a"); list02.add("b"); printArray(list01); //参数为ArrayList<Integer> printArray(list02); //参数为ArrayList<String> } //这里printArray的参数需要通配任意泛型的ArrayList,所以用通配符? public static void printArray(ArrayList<?> list){ //使用迭代器遍历集合 Iterator<?> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }
通配符的上下限定
? extends E
泛型的上限限定: 代表使用的泛型只能是E类型的子类/本身
? super E
泛型的下限限定: 代表使用的泛型只能是E类型的父类/本身
public class Demo06Generic { public static void main(String[] args) { Collection<Integer> list1 = new ArrayList<Integer>(); Collection<String> list2 = new ArrayList<String>(); Collection<Number> list3 = new ArrayList<Number>(); Collection<Object> list4 = new ArrayList<Object>(); getElement1(list1); //getElement1(list2);//报错 getElement1(list3); //getElement1(list4);//报错 //getElement2(list1);//报错 //getElement2(list2);//报错 getElement2(list3); getElement2(list4); /* 类与类之间的继承关系 Integer extends Number extends Object String extends Object */ } // 此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection<? extends Number> coll){} // 此时的泛型?,必须是Number类型或者Number类型的父类 public static void getElement2(Collection<? super Number> coll){} }