Erro estranho

oi

tava programando no meu programa de biblioteca quando me surgiu um erro estranho, que eu nunca tinha visto:

“clone() has protected acess in java.lang.Object”

como eu não tou conseguindo deslindar o caso decidi postar aqui a ver se vocês podiam fazer alguma coisa

o clone da class Aluno

public Aluno clone() {return new Aluno(this);}

o construtor de copia da class Aluno-esta por sua vez um subclass de utentes

public Aluno(Aluno x) {
       super((Utentes) x); curso = x.getCurso();
   }

codigo onde me está a dar o erro nomeadamente no “utente.put(x.getCodigo(),x.clone())” o utente é um hashmap

public void addUAluno(String nome, String codigo, String telefone, String morada, String ano_nascimento, String curso){
       
       Utentes x = new Aluno(nome, codigo, telefone, morada, ano_nascimento, curso);
       if(utente == null)
        utente.put(x.getCodigo(), x.clone());
      else
        if( this.existeUtente(x.getCodigo()) )
             System.out.println("ERRO!!!!Esse código já existe!!!!");
        else
             utente.put(x.getCodigo(), x.clone());
    
            }

postem aí qialquer coisa:

Obrigado

-TUGA-

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

Ler:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html

Ler
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone()

Ler:
http://www.cafeaulait.org/course/week4/46.html
http://www.portaljava.com.br/home/modules.php?name=Forums&file=viewtopic&p=148638

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.

class Inner implements Cloneable {
	int valor;
}

public class Teste implements Cloneable {
	int valor;
	Inner inner;

	@Override
	protected Teste clone() {
		try {
			return (Teste) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
	}

	public static void main(String[] args) {
		Teste t = new Teste();
		t.valor = 10;
		t.inner = new Inner();
		t.inner.valor = 10;
		Teste clone = 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:

class Inner implements Cloneable {
	int valor;

	@Override
	protected Inner clone() {
		try {
			return (Inner) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
	}
}

public class Teste implements Cloneable {
	int valor;
	Inner inner;

	@Override
	protected Teste clone() {
		try {
			Teste clone = (Teste) super.clone();
			clone.inner = inner.clone();
			return clone;
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
	}

	public static void main(String[] args) {
		Teste t = new Teste();
		t.valor = 10;
		t.inner = new Inner();
		t.inner.valor = 10;
		Teste clone = 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);
	}
}

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-

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 "pilofone@gmail.com" não se assuste sou eu :slight_smile:

Obrigado pela disponibilidade…

-TUGA-