1、泛型下界  下界通配符(super)  List<? super Father>



2、泛型上界  上界通配符(extends)  List<? extends Father>



package com.tiger.generic;
import java.util.*;
/**
* 泛型下界 下界通配符(super)
* 可以理解为调用者可以传入的类的下限
* @author tiger
*/
public class GenericDow {
//通配符的用法 ...
public static void main( String[] args ) {

//下限
copy( new ArrayList() );
System.out.println("---------------------");
copy( new ArrayList

() );
System.out.println("---------------------");
copy( new ArrayList

() );

//copy方法中参 数所指定的下界为Father,因此所有直接或间接继承Father的都不能传入
//copy( new ArrayList

());
//copy( new ArrayList

()); } /* * super 指定通配符的下限 ... */ public static void copy( List
list ){ //因为调用者传入的类型不确定,假如此时传入的是比爷爷类型小的,则就会出错。因此传入比下界还小的类型 //!list.add(new GrandFather("爷爷")); list.add(new Father("爸爸")); list.add(new Son("儿子")); list.add(new Grandson("孙子")); for(Object o : list)System.out.println(o); //因为这里有可能传入Object,所以传入的类型只能是顶层基类,即只能是Object。 //!for(GrandFather o : list){ } //!for(Father o : list){ } } } //定义一些继承关系 class GrandFather { String name; public GrandFather(String name) { super(); this.name = name; } @Override public String toString() { return "GrandFather [name=" + name + "]"; } } class Father extends GrandFather { String name; public Father(String name) { super(name); this.name = name; } public Father(String name, String name2) { super(name); name = name2; } } class Son extends Father { String name; public Son(String name) { super(name); this.name = name; } @Override public String toString() { return "Son [name=" + name + "]"; } } class Grandson extends Son { String name; public Grandson(String name) { super(name); this.name = name; } @Override public String toString() { return "Grandson [name=" + name + "]"; } }package com.tiger.generic; import java.util.*; /** * 泛型上界 上界通配符(extends) * 可以理解为调用者可以传入的类的上限 * @author tiger * @Date 2017年11月4日 */ public class GenericUpper { //通配符的用法 ... public static void main(String[] args) { //传进来的时候, 约束泛型参数一定要以 "父亲" 作为上界 //!copy( new ArrayList
()); //!copy( new ArrayList

()); //上界为 Father 祖父级以上的都不能进来 copy( new ArrayList

()); copy( new ArrayList

()); copy( new ArrayList

()); } /** * extends 指定通配符的上限 ... * @param list */ public static void copy( List
list ){ for( Object o : list )System.out.println(o); for( GrandFather o : list )System.out.println(o); for(Father o : list )System.out.println(o); //因为此时的list如果是Son的话,所以系统不能确定,编译不通过。 //!for(Son o : list ); //一旦使用了强转就失去的 "泛型" 的意义 .. // Son f3 = (Son) list.get(0); //!list.add( new Object()); //!list.add(new Father("爸爸")); //!list.add( new Son("儿子") ); list.add(null); //OK } }