黑马程序员技术交流社区

标题: 对<? extends E >与< ? super E >的简单程序演示和我的一些分析 [打印本页]

作者: lingyuezhixing    时间: 2015-11-15 23:39
标题: 对<? extends E >与< ? super E >的简单程序演示和我的一些分析
程序比较简单,很容易看懂,主要是对泛型的限定:   <? extends E > ,  < ? super E  > 的理解和体会。
不知之处还请学友多多提点。
                               

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class Car{
        private String name ;
        private int price ;
       
        Car(String name , int price ){
                this.name = name ;
                this.price = price ;
        }
       
        public String getName(){
                return name ;
        }
        public int getPrice(){
                return price ;
        }
}

class Baoma extends Car{
        Baoma(String name , int price ){
                super( name , price );
        }
}


public class WildcardDemo {

       
        /* 通过  printCollection 方法来演示  ? extends T */
       
        public static void printCollection( Collection<? extends Car> c){ // ? extends Car -----> Car c = (Car) ?类对象  ,向上转型
                for( Iterator<? extends Car> it =  c.iterator() ; it.hasNext() ; ){
                        System.out.println( ( it.next()).getName() );
                       
                        /*   ? 是最终父类(car)子类--则继承或 复写Car中的方法,
                                  当  ?类的对象 在调用该方法时,   被上转型为它的最高父类 Car的对象 ,
                                  所以调用Car类中的方法,就可以实现各自不同的表现形式,既多态的特性。
                                  这也就是  E extends ?  不限上限的原因。
                        */
                }
        }
       
        public static void main(String[] args) {


                ArrayList<Car> al = new ArrayList<Car>();
                al.add(new Car("car1" , 2222));
                al.add(new Car("car2" , 2333));
                al.add(new Car("car3" , 4222));
                printCollection(al);
               
                ArrayList<Baoma> all = new ArrayList<Baoma>( );
                all.add(new Baoma("baoma----1" , 2222));
                all.add(new Baoma("baoma----2" , 1333));
                all.add(new Baoma("baoma----3" , 4222));
                printCollection(all);
               
               
               
                /*下面通过 new TreeSet<E>((Comparator comparator) ) 来说明  ? super E  */
               
                TreeSet<Car> ts = new TreeSet<Car>( new CarPriceComparator() );
                ts.add(new Car("car1" , 2222));
                ts.add(new Car("car2" , 1333));
                ts.add(new Car("car3" , 4222));
               
               
                TreeSet< Baoma> tst = new TreeSet< Baoma>(new CarPriceComparator() );  //不用 (自己E)的比较器用 (父类?)的比较器
                tst.add(new Baoma("car1-------" , 2222));                                                          //  E(Baoma) 表示自己所属的类 , ?(Car) 表示父类 ,
                tst.add(new Baoma("car2-------" , 1333));                                                 
                tst.add(new Baoma("car3-------" , 4222));
               
                /*
                 为什么子类可以用父类的比较器?
                        子类掉用父类的比较器是,被上转型成父类对象
                        但对父类没有没有限制,所以你用的是它的父类都行,
                        父类比较器实现compare方法所调用的父类成员,子类都有(继承或复写)既可以通过编译
                        这也就是  ? super E 不限上限的原因。
                 */
               
        }       
}


/*车类的价格比较器*/
class CarPriceComparator implements Comparator< Car>{   

       
        public int compare(Car o1, Car o2) {
                int num = new Integer(o1.getPrice() ).compareTo(new Integer(o2.getPrice()) );
                if(num == 0)
                        return o1.getName().compareTo(o2.getName());
                return num ;
        }
}

/*宝马类的价格比较器*/
class BaomaPriceComparator implements Comparator< Baoma>{       

        public int compare(Baoma o1, Baoma o2) {
                int num = new Integer(o1.getPrice() ).compareTo(new Integer(o2.getPrice()) );
                if(num == 0)
                        return o1.getName().compareTo(o2.getName());
                return num ;
        }
       
}


作者: lingyuezhixing    时间: 2015-11-16 11:12
果然新人贴都没人回,好吧,下次我也发语言性的帖子好了,
作者: 耀阳圣尊    时间: 2015-11-16 12:11
写的不错,赞一个{:2_36:}
作者: 马官聘    时间: 2015-11-16 13:22
是啊,新人贴大神看不上,黑马币!
作者: 马官聘    时间: 2015-11-16 13:26
再帮你顶一个
作者: 唯我独赞mo    时间: 2015-11-16 16:01
不错很好,感谢分享
作者: YangChengLu    时间: 2015-11-16 19:45

作者: ash午夜阳光    时间: 2015-11-16 21:13
挺好的,很有营养,正好看了你的贴子补补盲点




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2