// Contravarianceinterface IGobbler<in T> { void gobble(T t);}// Since a QuadrupedGobbler can gobble any four-footed// creature, it is OK to treat it as a donkey gobbler.IGobbler<Donkey> dg = new QuadrupedGobbler();dg.gobble(MyDonkey());// Covarianceinterface ISpewer<out T> { T spew();}// A MouseSpewer obviously spews rodents (all mice are// rodents), so we can treat it as a rodent spewer.ISpewer<Rodent> rs = new MouseSpewer();Rodent r = rs.spew();为了完整......// Invarianceinterface IHat<T> { void hide(T t); T pull();}// A RabbitHat…IHat<Rabbit> rHat = RabbitHat();// …cannot be treated covariantly as a mammal hat…IHat<Mammal> mHat = rHat; // Compiler error// …because…mHat.hide(new Dolphin()); // Hide a dolphin in a rabbit hat??// It also cannot be treated contravariantly as a cottontail hat…IHat<CottonTail> cHat = rHat; // Compiler error// …because…rHat.hide(new MarshRabbit());cHat.pull(); // Pull a marsh rabbit out of a cottontail hat??