codigo onde me está a dar o erro nomeadamente no “utente.put(x.getCodigo(),x.clone())” o utente é um hashmap
publicvoidaddUAluno(Stringnome,Stringcodigo,Stringtelefone,Stringmorada,Stringano_nascimento,Stringcurso){Utentesx=newAluno(nome,codigo,telefone,morada,ano_nascimento,curso);if(utente==null)utente.put(x.getCodigo(),x.clone());elseif(this.existeUtente(x.getCodigo()))System.out.println("ERRO!!!!Esse código já existe!!!!");elseutente.put(x.getCodigo(),x.clone());}
Vc esta tentando chamar clone a partir de um objeto Utente, que provavelmente não suporta clone.
Para um objeto suportar clone ele tem que implementar a interface Cloneable, por default os objetos não suportam, ai porque ele estar como protected tb… mas implementando Cloneable vcsobrescreve o método clone do objeto e ai pode alterar o modificador para public
Só para entender bem, segue um exemplo simples de forma errada e certa de clone:
Erro: Dentro da minha classe que implementa Cloneable (Teste) tenho um atributo que é outro objeto, perceba que quando crio o objeto original (t), eu seto todos valores como 10, depois faço um clone e altero o valor e o valor de inner para 20 no objeto clone, quando mostro os valores do clone e do objeto original (t), o valor foi clonado porém o valor de inner não foi, pois não clonei o objeto inner, e de acordo com a documentação, o clone só vai clonar para vc objetos imutaveis (String, Integer, etc) e tipos primitivos, mas meu objeto inner não é nenhum dos dois, logo não foi clonado e o mesmo objeto de T original é referenciado pelo meu objeto clonado, logo quando alterei o valor de inner no objeto clone, foi alterado tb o valor inner do objeto original.
classInnerimplementsCloneable{intvalor;}publicclassTesteimplementsCloneable{intvalor;Innerinner;@OverrideprotectedTesteclone(){try{return(Teste)super.clone();}catch(CloneNotSupportedExceptione){e.printStackTrace();returnnull;}}publicstaticvoidmain(String[]args){Testet=newTeste();t.valor=10;t.inner=newInner();t.inner.valor=10;Testeclone=t.clone();clone.valor=20;clone.inner.valor=20;System.out.println("Valor em t: "+t.valor+" Valor em clone: "+clone.valor);System.out.println("Valor inner em t: "+t.inner.valor+" Valor inner em clone: "+clone.inner.valor);}}
Corrigir isso é na hora de clonar o Teste, vc tem que clonar tb os atributos que não são primitivos e imutáveis, segue o código correto:
classInnerimplementsCloneable{intvalor;@OverrideprotectedInnerclone(){try{return(Inner)super.clone();}catch(CloneNotSupportedExceptione){e.printStackTrace();returnnull;}}}publicclassTesteimplementsCloneable{intvalor;Innerinner;@OverrideprotectedTesteclone(){try{Testeclone=(Teste)super.clone();clone.inner=inner.clone();returnclone;}catch(CloneNotSupportedExceptione){e.printStackTrace();returnnull;}}publicstaticvoidmain(String[]args){Testet=newTeste();t.valor=10;t.inner=newInner();t.inner.valor=10;Testeclone=t.clone();clone.valor=20;clone.inner.valor=20;System.out.println("Valor em t: "+t.valor+" Valor em clone: "+clone.valor);System.out.println("Valor inner em t: "+t.inner.valor+" Valor inner em clone: "+clone.inner.valor);}}
T
tuga50PJ
hum ainda não entendi bem como isso funciona…eu li uma serie de coisas acerca do cloneable e metodos de clone mas não cheguei a perceber porque o meu não dá ou qual é o erro…pois eu tenho o cloneable e o metodo clone() está correcto…
postem aí algo
Obrigado
-TUGA-
T
tuga50PJ
afff
já cheguei na solução…
o meu problema tava na class abstract que não tinha o clone() bastava fazer um public abstract Utentes clone(); na class utentes pa ficar direitinho…
ps… (Lubs)adicionei você ao contactos do msn, se vc vêr o mail "[email removido]" não se assuste sou eu