public class AirTrafficController { public static Plane<Landed> land(Plane<Flying> p) { return new Plane<Landed>(p); } public static Plane<Flying> takeOff(Plane<Landed> p) { return new Plane<Flying>(p); } public static void main(String[] args){ Plane<Landed> p=Plane.newPlane(); Plane<Flying> fly=takeOff(p); Plane<Landed> land=land(fly); //doesn't compile: //Plane<Landed> reallyLanded=land(land); //Plane<Flying> reallyFlying=takeOff(fly); } }