• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bsr

Erro ao compilar.

8 mensagens neste tópico

Ola, tenho o seguinte codigo e esta a dar-me o seguinte erro:  clone() has protected acess in java.lang.Object

o erro esta a dar nas linhas do foreach.

Alguem tem alguma sugestão de como corrigir?


import java.util.ArrayList; 

public class Exficha4
{

/** Variaveis de instancia */

private ArrayList<String> amigos;
private ArrayList<String> musicos;

/** Construtor Vazio - Redefine construtor por omissão*/

    public Exficha4(){
        amigos = new ArrayList<String>(); // vazio 
        musicos = new ArrayList<String>(50); // capacidade = 50
    }

/** Contrutor das partes*/

    public Exficha4(ArrayList<String> lamigos, ArrayList<String> lmusicos){
       amigos = new ArrayList<String>();
       musicos = new ArrayList<String>(50);
       for(String a : lamigos) amigos.add(a.clone());
       for(String m : lmusicos) musicos.add(m.clone());
    }    
    
/** Construtor de copia */

    public Exficha4(Exficha4 fi) {
        amigos = new ArrayList<String>();
        for(String a : fi.comoArrayList()) amigos.add(a.clone()); 
        musicos = new ArrayList<String>();
        for(String m : fi.comoArrayList()) musicos.add(p.clone()); 
    }

/** Metodo CLone */

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


}



0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não diz em que linha está o erro?

De qualquer forma, não percebi de onde vem o p aqui:

for(String m : fi.comoArrayList()) musicos.add(p.clone());

Não seria m?

E o método clone deve devolver Object e não Exficha4.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse erro está bem explicado: o método clone é protected, pelo que não lhe podes aceder de forma pública.

A julgar pelo teu código, creio que o que queres fazer é adicionar as strings a e m a amigos e musicos, pelo que a chamada ao método clone não está ai a fazer nada.

Talvez o que queiras te seja dado directamente pelo mótodo addAll do ArrayList, vê aqui: http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A questão não estará no acesso mas sim na redefinição. Ao redefinires o método clone() alteraste-lhe a visibilidade.

Para redefinires um método não podes alterar a visibilidade com que esse método se encontra nas super-classes, assim, se um método é protected não pode deixar de o ser em sub-classes. Altera a reimplementação do método clone() exactamente para a assinatura com que o método existe na classe Object.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A questão não estará no acesso mas sim na redefinição. Ao redefinires o método clone() alteraste-lhe a visibilidade.

Para redefinires um método não podes alterar a visibilidade com que esse método se encontra nas super-classes, assim, se um método é protected não pode deixar de o ser em sub-classes. Altera a reimplementação do método clone() exactamente para a assinatura com que o método existe na classe Object.

O problema não é esse... Aliás, sempre que redefino o método clone numa classe, defino o método como público.

O problema está ao fazer o clone de strings. Parece que a classe String não implementa o clone (que também não faz muita falta), logo o clone que é chamado é o da classe Object, que é protected, e como tal não está acessível nesta situação.

Para resolver o problema basta remover os clones, que, tendo em conta o funcionamento das strings em Java, são desnecessários.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A String herda o método clone do Object, o que quer dizer que o mesmo é protected.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens razão Rui, confundi com dar menos visibilidade ao método.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agradeço as ajudas.

Depois de alguma pesquisa cheguei à conclusão que as Strings não necessitam ser clonadas pois são objectos estáticos.

Por isso nos foreach (for(String a : lamigos) amigos.add(a.clone()); ) fica for(String a : lamigos) amigos.add(a);

Em relação a for(String m : fi.comoArrayList()) musicos.add(p.clone());  realmente o p deveria ser m e depois tinha de retirar como referi o .clone().

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora