一、受限制的通配符
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];
}
}