黑马程序员_java对泛型的限定: <? extends E > , < ? super E > 的理解和体会。

------- android培训java培训、期待与您交流! ----------

为什么子类可以用父类的比较器? 
       子类掉用父类的比较器是,被上转型成父类对象
        但对父类没有没有限制,所以你用的是它的父类都行, 
      父类比较器实现compare方法所调用的父类成员,子类都有(继承或复写)既可以通过编译
      这也就是  ? 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 ;
        }
        
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java泛型中,`<? extends T>`和`<? super T>`是用来限定通配符(Wildcard)的上界和下界。 1. `<? extends T>`:表示通配符的上界是T或T的子类。使用`<? extends T>`可以使泛型类型接受T或T的子类型作为参数,但不能用于写入对象。 ```java public void processList(List<? extends Number> list) { for (Number num : list) { System.out.println(num); } } List<Integer> integers = new ArrayList<>(); integers.add(1); integers.add(2); processList(integers); // 可以传递List<Integer>或List<Number>,但不能传递List<Object> ``` 在上述示例中,`processList()`方法接受一个`List<? extends Number>`类型的参数,这意味着可以传递`List<Integer>`或`List<Number>`作为参数。在方法内部,我们可以从list中读取Number类型的元素,因为Number是Integer的父类。 2. `<? super T>`:表示通配符的下界是T或T的父类。使用`<? super T>`可以使泛型类型接受T或T的父类型作为参数,并且可以用于写入对象。 ```java public void addToList(List<? super Integer> list) { list.add(1); list.add(2); } List<Number> numbers = new ArrayList<>(); numbers.add(0.5); addToList(numbers); // 可以传递List<Integer>或List<Object>,但不能传递List<Number> System.out.println(numbers); // 输出:[0.5, 1, 2] ``` 在上述示例中,`addToList()`方法接受一个`List<? super Integer>`类型的参数,这意味着可以传递`List<Integer>`或`List<Object>`作为参数。在方法内部,我们可以向list中添加Integer类型的元素,因为Integer是Number的子类。 总结: - `<? extends T>`用于限定泛型的上界,可以读取泛型对象,但不能写入; - `<? super T>`用于限定泛型的下界,可以写入泛型对象,但读取时需要进行类型转换。 使用通配符的目的是为了增加泛型的灵活性,在不确定具体类型的情况下,能够处理更广泛的数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值