O construtor padrão necessita de mais atenção do que o personalizado pois implica na necessidade de trabalhar com valores nulos.
Vide codificação semelhante:
//classe SerVivo
importjavax.swing.JOptionPane;publicabstractclassSerVivo<T>{privateTtipo;publicSerVivo(){}protectedSerVivo(Ttipo)throwsNullPointerException{if(tipo==null){thrownewNullPointerException("O construtor utilizado não aceita null como parâmetro");}this.tipo=tipo;}publicTgetTipo(){returntipo;}protectedvoidsetTipo(Ttipo){if(isTipado()){mensagem("Animal já tipificado: "+this.tipo+" ["+this.tipo.getClass().getSimpleName()+"], a operação cancelada\n");return;}this.tipo=tipo;}protectedbooleanisTipado(){returntipo!=null;}voidmensagem(Stringmsg){JOptionPane.showMessageDialog(null,msg);}}
//classe Animal
publicclassAnimal<T>extendsSerVivo<T>{protectedintcodigo=Integer.MAX_VALUE;publicAnimal(){}publicAnimal(Tclasse,intcodigo){super(classe);this.codigo=codigo;}publicvoidsetCodigo(intcodigo){if(!isTipado()){mensagem("Necessário tipificar o animal antes de codificar");}else{if(this.codigo!=Integer.MAX_VALUE){mensagem("Animal já codificado "+this.codigo);}else{this.codigo=codigo;mensagem("Codificação realizada ["+codigo+"] para "+getTipo()+" ["+getTipo().getClass().getSimpleName()+"]");}}}publicintgetCodigo(){returncodigo;}}
//classe de teste
publicclassCrisis{publicstaticvoidmain(String[]args){testes();}publicstaticvoidtestes(){SerVivo<String>primeiro;SerVivo<Integer>segundo;SerVivo<Animal>animal1;primeiro=newAnimal<>("Urso",25);segundo=newAnimal<>(14,100);animal1=newAnimal<>();animal1.mensagem(animal1.getTipo()+(animal1.isTipado()?" Sim foi tipado":" Aguardando tipar"));animal1.setTipo(newAnimal());animal1.mensagem(animal1.getTipo()+(animal1.isTipado()?" Sim foi tipado":" Aguardando tipar "+animal1.getTipo().getClass()));primeiro.setTipo("Troll");segundo.setTipo(54);((Animal)animal1).setCodigo(43);Animal<ArrayList<Animal>>relva=newAnimal();System.out.println(relva.getTipo());relva.setTipo(newArrayList<>());System.out.println(relva.isTipado()+" "+relva.getTipo().getClass().getSimpleName());}}