泛型及通配符上下限的使用解析

it2022-05-09  31

在java中?指泛型的通配符,可以表示任何类型。如List<?>,Map<?,?>等, 还可以设置通配符的上限与下限类型

public class GenericityTest { public static void main(String[] args) { List<String> lists = new ArrayList<>(); lists.add("111"); test(lists); testT(lists); testLimit(lists); //编译不通过了,因为不是Integer或者其子类 List<Integer> integerLists = new ArrayList<>(); integerLists.add(123); test(integerLists); testT(integerLists); testUpLimit(integerLists); //编译通过了,因为Integer是Number子类 List<Number> numberLists = new ArrayList<>(); numberLists.add(123456); testBottomLimit(integerLists); //编译不通过了,因为Integer不是Number或者其父类,而是其子类 testBottomLimit(numberLists); //编译通过了,因为是Number类或其父类 } //使用通配符,不设置上线 public static void test(List<?> lists) { for (int i = 0; i < lists.size(); i++) { System.out.println("值:" + lists.get(i)); } } //但是如果我们仅希望某个父类及其下的子类可以使用该方法呢?那么我们就应该设置通配符的上限了。 //设置通配符上限是Number类型 public static void testUpLimit(List<? extends Number> lists) { for (int i = 0; i < lists.size(); i++) { System.out.println("值:" + lists.get(i)); } } //如果想要该类型是某类型或其父类的话,那可以设置通配符下限 //设置通配符下限是Number类型 public static void testBottomLimit(List<? super Number> lists) { for (int i = 0; i < lists.size(); i++) { System.out.println("值:" + lists.get(i)); } } //使用泛型类型 public static <T> void testT(List<T> lists) { for (int i = 0; i < lists.size(); i++) { System.out.println("值:" + lists.get(i)); } } }

最新回复(0)