java泛型学习三:受限制的通配符以及泛型方法

 一、受限制的通配符 

 

package generic; import generic.windcard.Circle; import generic.windcard.Shape; import java.awt.Canvas; import java.util.ArrayList; import java.util.List; //受限制的通配符 public class BoundedWildcard { //说明Circle类继承自Shape类 private static Circle circle= new Circle(); private static Shape shape=new Shape(); public void drawAll(List<Shape> shapes) { for (Shape s : shapes) { s.draw(new Canvas()); } } public void drawAllWithWildcard(List<? extends Shape> shapes) { for (Shape s : shapes) { s.draw(new Canvas()); } } public static void main(String args[]){ /* * l1与l2对比结果: * drawAll(List<Shape> shapes):只可以接受泛型类型为Shape类型的 * List<? extends Shape> shapes):可以接受泛型类型为Shape及Shape子类的声明 * * */ BoundedWildcard boundedWildcard=new BoundedWildcard(); List<Shape> l1=new ArrayList<Shape>(); l1.add(circle); boundedWildcard.drawAll(l1); boundedWildcard.drawAllWithWildcard(l1); List<Circle> l2=new ArrayList<Circle>(); l2.add(circle); //boundedWildcard.drawAll(l2); The method drawAll(List<Shape>) in the type BoundedWildcard is not applicable for the arguments (List<Circle>) boundedWildcard.drawAllWithWildcard(l2); /* * l3与l4对比结果: * List<Shape> l3=new ArrayList<Shape>();可以接受泛型类型为Shape及Shape子类的元素 * List<? extends Shape> l4=new ArrayList<Shape>():只可以增加null类型的元素 * */ List<Shape> l3=new ArrayList<Shape>(); l3.add(shape); l3.add(circle); /* *泛型声明中如果有通配符?,则在这个声明指向的泛型对象中,除了null不能加入任何的对象。 *即不能把对象放进一个未知类型的集合中去 * */ List<? extends Shape> l4=new ArrayList<Shape>(); // l4.add(shape);//complie error: //l4.add(circle);;//complie error: l4.add(null); } }

 二、泛型方法

 

 

package generic;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

//泛型方法

public class GenericMethod {
	/*说明:这个方法是把数组的元素全部转存到集合中,但是数组中元素的类型不确定,所以定义集合泛型时使用了通配符,
	*   但是前面我们已经说过,泛型声明中如果有通配符?,则在这个声明指向的泛型对象中,除了null不能加入任何的对象。
	*   所以c.add(o); 会报编译错误。
	*   我们使用泛型方法来解决这个问题
	**/
	public static void fromArrayToCollection(Object[] a, Collection<?> c) {
		for (Object o : a) {
			//c.add(o); // 编译期错误:he method add(capture#1-of ?) in the type
						// Collection<capture#1-of ?> is not applicable for the
						// arguments (Object):
		}
	}
	/*
	 * 泛型函数允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。
	 * 如果没有这样的依赖关系,不应该使用泛型方法。
	 * **/
	public static <T> void fromArrayToCollectionWithGeneric(T[] a, Collection<T> c){
	       for (T o : a) {
	           c.add(o); // correct
	       }
	    }
	

}

 

 

三、一些细节

 

package generic;

import java.util.ArrayList;
import java.util.List;

public class ImportantThing {
     public static void main(String args[]){
    	 List<String> l1 = new ArrayList<String>();
         List<Integer> l2 = new ArrayList<Integer>();
         System.out.println(l1.getClass() == l2.getClass());//result:true
         System.out.println(l1.getClass()); //result:class java.util.ArrayList
         System.out.println(l2.getClass()); //result:class java.util.ArrayList
         /*
          * 数组对象的组成类型不能是一个类型变量或者类型参数
          * 但是可以通配符的类型
          * */
        // List<String>[] lsa = new List<String>[10]; //编译期错误:Cannot create a generic array of List<String>
         List<?>[] lsb=new ArrayList<?>[10];
     }
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值