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); } private List<List<? extends Shape>> history = new LinkedList<List<? extends Shape>>(); public void drawAll(List<? extends Shape> shapes) { history.add(shapes); for (Shape s: shapes) { s.draw(this); } } } class G17 { 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); } }