天涯尽头无女友
PECS(“ 生产者extends和消费者super ”的缩写)可以解释为:获取和放置原则获取和放置原则(来自Java泛型和集合)它指出,当您只从结构中获取值时,请使用扩展通配符仅在将值放入结构时使用超级通配符当你得到和放置时,不要使用通配符。让我们通过例子来理解它:1.用于扩展通配符(获取值即生产者extends)这是一个方法,它采用一组数字,将每个数字转换为a double,然后对它们求和public static double sum(Collection<? extends Number> nums) { double s = 0.0; for (Number num : nums) s += num.doubleValue(); return s;}我们称之为方法:List<Integer>ints = Arrays.asList(1,2,3);assert sum(ints) == 6.0;List<Double>doubles = Arrays.asList(2.78,3.14);assert sum(doubles) == 5.92;List<Number>nums = Arrays.<Number>asList(1,2,2.78,3.14);assert sum(nums) == 8.92;由于sum()方法的使用extends,所有以下调用都是合法的。如果未使用扩展,前两个调用将不合法。EXCEPTION:您不能将任何内容 放入使用extends通配符声明的类型中- 除了null属于每个引用类型的值:List<Integer> ints = new ArrayList<Integer>();ints.add(1);ints.add(2);List<? extends Number> nums = ints;nums.add(null); // okassert nums.toString().equals("[1, 2, null]");2.对于超级通配符(放置值即消费者super)这是一个方法,它接受数字和a的集合int n,并将n从零开始的第一个整数放入集合中:public static void count(Collection<? super Integer> ints, int n) { for (int i = 0; i < n; i++) ints.add(i);}我们称之为方法:List<Integer>ints = new ArrayList<Integer>();count(ints, 5);assert ints.toString().equals("[0, 1, 2, 3, 4]");List<Number>nums = new ArrayList<Number>();count(nums, 5); nums.add(5.0);assert nums.toString().equals("[0, 1, 2, 3, 4, 5.0]");List<Object>objs = new ArrayList<Object>();count(objs, 5); objs.add("five");assert objs.toString().equals("[0, 1, 2, 3, 4, five]");由于count()方法使用super,所有以下调用都是合法的:如果不使用super,则最后两次调用将不合法。EXCEPTION:你不能从使用super通配符声明的类型中获取任何东西 - 除了type的值Object,它是每个引用类型的超类型:List<Object> objs = Arrays.<Object>asList(1,"two");List<? super Integer> ints = objs;String str = "";for (Object obj : ints) str += obj.toString();assert str.equals("1two");3.当获取和放置时,不要使用通配符无论何时将值放入并从同一结构中获取值,都不应使用通配符。public static double sumCount(Collection<Number> nums, int n) { count(nums, n); return sum(nums);}