标签:
在学习java中泛型这块内容的时候,刚开始非常容易理解,但是,到通配符的时候,我就晕了,因为学习java这块内容的指导思想,是比对着.net来的,可是java中的通配符,.net中没有这样的概念,于是花时间学习了一下,下面通过例子向大家讲解通配符
package com.tgb.mydemo; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args){ Integer[] integers = {1,2,3,4,5}; ArrayList<Integer> integerList = new ArrayList<Integer>(); for (Integer integer : integers) { integerList.add(integer); } System.out.println("Total of the elements in integerList:" + sum(integerList)); Double[] doubles = {1.1,2.2,3.3,4.4,5.5}; ArrayList<Double> doubleList = new ArrayList<Double>(); for (Double element : doubles) { doubleList.add(element); } System.out.println("Total of the elements in integerList:" + sum(doubleList)); Number[] numbers = {1.1,2.2,3,4,5.5}; ArrayList<Number> numberList = new ArrayList<Number>(); for (Number element : numbers) { numberList.add(element); } System.out.println("Total of the elements in integerList:" + sum(numberList)); } public static double sum(ArrayList<Number> list){ double total = 0; for(Number element : list ){ total += element.doubleValue(); } return total; } }注:Number是Double和Integer的父类
将上面的代码放在java的IDE中,会出现语法错误,为什么呢?因为sum函数的参数类型为ArrayList<Number>,我们使用sum函数时,给其传递的是ArrayList<Integer>或者ArrayList<Double>类型,虽然Number类型是Double和Integer类型的父类,但是,编译器不把ArrayList<Number>和ArrayList<Integer>(ArrayList<Double>)当成同一个类型看待,所以,此时,就会在代码编辑的时候,报错,如果我们sum中的参数类型换成ArrayList<? extends Number>,就解决了这个问题,而“?”就是通配符,这个也就是为什么出现了通配符。
这里说的泛型约束是定义泛型类时的泛型约束,从这句话我们也就知道了,泛型约束是在定义泛型类时使用的,是定义泛型类时对泛型做的一个约束,通配符是在使用泛型类时,对类型做的一个约束。
通配符的约束有3种。
无约束:<?>,即,类型的父类必须是Object类型。
上限约束:<? extends 类型1>,即,类型必须是类型1的子类或者是类型1。
下线约束:<? super 类型1>,即,类型必须是类型1的父类或者是类型1。
通配符使我们在使用泛型类本该给出具体类型的情况,变成了,将具体类型给参数化了的情况,从而使得最终使用者的范围变得更小了。
标签:
原文地址:http://blog.csdn.net/jiben2qingshan/article/details/42274405