java泛型(3) 类型通配符

  1. 开门见山,先说一个核心的原理,如果a是b的子类,List<a>会是List<b>的子类吗?不是的,在List,Set,Map中都不会是
  2. 在一个方法中,需要用到带有泛型的集合该怎么办?可以用list<Object>吗?不行,第一点说的就是这个,这个时候应该用的是类型通配符(记为 ?),以下为代码实例:详细的讲解穿插在代码之中
    package WildCard;
    
    import java.util.ArrayList;
    import java.util.List;
    
    abstract class Shape{
        public abstract void draw(Canvas c);
    }
    
    class Circle extends Shape{
        @Override
        public void draw(Canvas c) {
            System.out.println("圆圆" + c);
        }
    }
    
    
    class Rec extends Shape{
        @Override
        public void draw(Canvas c) {
            System.out.println("方方" + c);
        }
    }
    
    
    public class Canvas {
    
        public void drawAll(List<? extends Shape> shapes){
    //        public void drawAll(List<? extends Shape> shapes)
    //        1.这一句首先用public void drawAll(List<Shape> shapes),然后程序编译出错,
    //        因为不管是List<Circle>,List<Rec>都不是List<Shape>的子类
    //        2.然后用public void drawAll(List<Shape> shapes),程序运行倒是可以
    //        运行,就是for循环得酱紫写:
    //        for(Object object : shapes){
    //            Shape shape = (Shape)Object;
    //            shape.draw(this);
    //        }
    //        其实就是说"?"通配了所有的类,所以在使用的时候还得强制转化,这也不是最好的选择
    //        最好的解决方法是让"?"继承于Shape类
    
    
    
            for(Shape shape : shapes){
                shape.draw(this);
            }
    
        }
    
        public static void main(String args[]){
            List<Circle> list = new ArrayList<>();
            list.add(new Circle());
            list.add(new Circle());
            Canvas c = new Canvas();
            c.drawAll(list);
    
            List<Rec> list1 = new ArrayList<>();
            list1.add(new Rec());
            list1.add(new Rec());
            Canvas c1 = new Canvas();
            c1.drawAll(list1);
        }
    
    }
    

    xx

  3. 甚至,在声明类的时候就可以指定泛型的父类了,代码实例如下,和实现接口的情况类似,当有多喝上限时,类的上限必须位于位于第一位

    package WildCard;
    
    public class ManyWildCard<T extends  Number & java.io.Serializable> {
        T col;
        public static void main(String args[]){
    
            ManyWildCard<Integer> manyWildCard = new ManyWildCard<>();
            ManyWildCard<Double> manyWildCard1 = new ManyWildCard<>();
            
            
    //        ManyWildCard<String> manyWildCard2 = new ManyWildCard<>();
    ////        这一句会报错,因为String不是继承自Number
    
        }
    }
    

猜你喜欢

转载自blog.csdn.net/weixin_39452731/article/details/81415061