Jump to content

Erro ao compilar: clone() has protected acess in java.lang.Object


Go to solution Solved by Rui Carlos,

Recommended Posts

Posted

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);
    }


}



Posted

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

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Posted

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.

  • Solution
Posted
Em 20/04/2009 às 15:28, Knitter disse:

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, visto que as strings são imutáveis), 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.

Posted

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

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Posted

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.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.