import java.util.*;

abstract class Shape {
    public abstract void draw(Canvas c);
}

class Circle extends Shape {
    private int x, y, radius;
    public void draw(Canvas c) {
        // drawing circle
    }
}

class Rectangle extends Shape {
    private int x, y, width, height;
    public void draw(Canvas c) {
        // drawing rectangle
    }
}

class Canvas {
    public void draw(Shape s) {
        s.draw(this);
    }

    // bounded polymorphism
    
    public void drawAll(List<? extends Shape> shapes) {        // upper bound
    //public <T extends Shape> void drawAll(List<T> shapes) {
       for (Shape s: shapes) {
          s.draw(this);
       }
    }

}

class G13c {
  public static void main( String[] args ){
      Canvas c = new Canvas();
      List<Shape> shapes = new ArrayList<Shape>();
      shapes.add(new Circle());
      shapes.add(new Rectangle());
      c.drawAll(shapes);

      List<Circle> circles = new LinkedList<Circle>();
      circles.add(new Circle());
      circles.add(new Circle());
      c.drawAll(circles);
  }
}