java泛型中的通配符

概述

       在学习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。


总结

       通配符使我们在使用泛型类本该给出具体类型的情况,变成了,将具体类型给参数化了的情况,从而使得最终使用者的范围变得更小了。

你可能感兴趣的:(java泛型中的通配符)