Assunto abordado por Cardelli (1985), o polimorfismo de inclusao e o polimorfismo que decorre do mecanismo de heranca tambem conhecido como e-um e subtipos. A questao ser observada e a implementacao correta do contrato da classe em todas as suas subclasses e se os campos estao sendo tratados de forma consistente. E necessario verificar ainda se as informacoes estao distribuidas corretamente ao longo da hierarquia. Itens usados de forma geral devem estar na superclasse e itens particulares, nas subclasses. Os subtipos devem ser aceitos onde os tipos forem esperados.Veja o exemplo da implementacao a seguir de um sistema de guarda de veiculos em uma garagem. Nele observamos problemas como inconsistencia no uso do campo plate por algumas operacoes e a operacao identify que poderia ter sua implementacao realizada de uma forma mais geral://Classe Veiculoclass Vehicle {protected String plate;public vehicle(){ };public Vehicle(String p){plate = p;}public String identify(){return "generic vehicle";}}//Classe Carro, subclasse de Veiculoclass Car extends Vehicle {public Car(){super();}public Car(String p){super(p);}public String identify {return "car with plate" + plate;}}//Classe Caminhao, sublcasse de veiculoclass Truck extends Vehicle {public Truck() { super(); }public Truck(String p) {super(p);}public String identify( ){return "truck with plate " + plate;}}//Classe Garagemclass Garage {private int maxVehicles;private Vehicle[ ] parked;public Garage(int max) {maxVehicles = (max < 1)? 1 : max;parked = new Vehicle[maxVehicles];} //Preencher vagapublic int accept(Vehicle v) {for(int bay = 0; bay<maxVehicles; ++bay )if (parked[bay] = null) {parked[bay] = v; return bay;}return -1; // no bay available;}//Devolver o veiculo e liberar a vagapublic Vehicle release(int bay){if (bay<0 || bay>=maxVehicles)return null;Vehicle v = parked[bay];parked[bay] = null;return v;} //Listar veiculos estacionados na garagempublic void listVehicles(){for(int bay = 0; bay < maxVehicles; ++bay)if( parked[bay] != null ) {System.out.println ("Vehicle in bay " + bay + "is " parked[bay].identify());}}//Um dia na garagempublic static void main(String[ ] args){Garage park(15);//Veiculos em operacaoVehicle c1 = new Car("RVR 101");Vehicle c2 = new Car("SPT 202");Vehicle c3 = new Car("CHP 303");Vehicle c4 = new Car("BDY 404");Vehicle c5 = new Car("BCH 505");Vehicle t1 = new Truck("TBL 606");Vehicle t2 = new Truck("IKY 707");Vehicle t3 = new Truck("FFY 808");Vehicle t4 = new Truck("PCS 909");Vehicle t5 = new Truck("SLY 000");park.accept(c1);int t2bay = park.accept(t2);Park.accept(c3); park.accept(t1);int c4bay = park.accept(c4);park.accept(c5); park.accept(t5);park.release(t2bay);park.accept(t4); park.accept(t3);park.release(c4bay); park.accept(c2);park.listVehicles();}}Ao analisar separadamente as seguintes partes do codigo dado, vamos identificar o problema da implementacao://As construtoras iniciam plate com null:public Vehicle( ) { }public Car( ) extends Vehicle( ) { }public Truck( ) extends Vehicle( ) { }//As seguintes operacoes supoem que plate nao poderia ser nullpublic String identify() { //identify de Carreturn car with plate " + plate;}public String identify( ){ //identify de Truckreturn "truck with plate " + plate; }Verifique a solucao do problema com as operacoes corrigidas. Agora elas inicializam o campo antes de imprimir:public String identify() { //identify de CarString p = plate? plate : <none>;return "car with plate " + p);}public String identify( ){ //identify de TruckString p = plate? plate : <none>;return "truck with plate + p);}Ainda verificando problemas nessa implementacao de polimorfismo. Podemos ver na organizacao da hierarquia que a operacao idenfify e utilizada de forma quase identica pelas duas subclasses. A unica alteracao nelas e que uma imprime car