泛型类和泛型方法的使用:类名<泛型> 方法名<泛型>
public class MyClass<E> { public void print(E e) { System.out.println(e); } }
public class GenericTest { public static void main(String[] args) { MyClass<String> myClass1 = new MyClass<>(); myClass1.print("String"); // String MyClass<Integer> myClass2 = new MyClass<>(); myClass2.print(111); // 111 } }
泛型接口和泛型方法的使用:接口名<泛型> 方法名<泛型>
public interface MyInter<T> { public abstract void print(T t); }
public class MyInterImpl2<T> implements MyInter<T> { @Override public void print(T t) { System.out.println(t); } }
public class GenericTest { public static void main(String[] args) { MyInter<String> myInter2 = new MyInterImpl2<String>(); myInter2.print("String"); // String MyInter<Integer> myInter3 = new MyInterImpl2<>(); myInter3.print(111); // 111 MyInter<String> myInter = new MyInter<String>() { @Override public void print(String s) { System.out.println(s); } }; myInter.print("字符串类型"); // 字符串类型 new MyInter<Integer>() { @Override public void print(Integer integer) { System.out.println(integer); } }.print(222); // 222 } }
泛型通配符:定义的时候不可以使用(ArrayList<?> list = new ArrayList<?>),只能作为参数传递时使用,表示可以接收任何泛型类型的参数
public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(); list1.add("AA"); list1.add("BB"); list1.add("CC"); ArrayList<Integer> list2 = new ArrayList<>(); list2.add(111); list2.add(222); list2.add(333); print(list1); // AA BB CC print(list2); // 111 222 333 } private static void print(ArrayList<?> list1) { // 泛型不会自动提升类型,所以这里泛型不能使用Object类型来接收所有泛型类型,只能用通配符? /*Iterator<?> iterator = list1.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }*/ for (int i = 0; i < list1.size(); i++) { System.out.println(list1.get(i)); } }
通配符高级使用--受限泛型
泛型的上限:
格式:类型名称 <? extends 类> 对象名称
意义:只能接收该类型及其子类
泛型的下限:
格式:类型名称<? super 类> 对象名称
意义:只能接收该类型及其父类
public static void main(String[] args) { ArrayList<Integer> integers = new ArrayList<>(); ArrayList<String> strings = new ArrayList<>(); ArrayList<Number> numbers = new ArrayList<>(); ArrayList<Object> objects = new ArrayList<>(); getElement1(integers); // getElement1(strings); // 报错 getElement1(numbers); // getElement1(objects); // 报错 // getElement2(integers); // 报错 // getElement2(strings); // 报错 getElement2(numbers); getElement2(objects); } private static void getElement1(ArrayList<? extends Number> integers) { } private static void getElement2(ArrayList<? super Number> integers) { }