web-dev-qa-db-fra.com

La méthode clone () de object n'est pas visible?

Question:

package GoodQuestions;
public class MyClass {  
    MyClass() throws CloneNotSupportedException {
        try {
            throw new CloneNotSupportedException();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }   

    public static void main(String[] args) {    
        try {
            MyClass  obj = new MyClass();
            MyClass obj3 = (MyClass)obj.clone();            
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

Ici, la classe 'MyClass' peut pouvoir cloner son propre objet en appelant la méthode de clonage dans la classe 'Object' . Le même paquet 'GoodQuestions' génère l'erreur de compilation suivante.

'La méthode clone () du type Object n'est pas visible'

Alors, voici le code qui jette l'erreur ci-dessus?

package GoodQuestions;
public class TestSingleTon {
    public static void main(String[] args) {
        MyClass  obj = new MyClass();
        MyClass obj3 = obj.clone(); ---> here is the compile error.
    }
}
43
sekhar

Cette erreur se produit car dans la classe Object, la méthode clone () est protégée . Vous devez donc remplacer la méthode clone () dans la classe respective . Ajouter le code ci-dessous dans MyClass 

@Override
protected Object clone() throws CloneNotSupportedException {

    return super.clone();
}

Mettre également en œuvre une interface clonable. public class MyClass implements Cloneable

9
Prashant K

clone() a un accès protégé. Ajouter ceci dans MyClass

public Object clone(){  
    try{  
        return super.clone();  
    }catch(Exception e){ 
        return null; 
    }
}

Changer également en public class MyClass implements Cloneable

44
EsotericMe

Parce que clone () est une méthode protégée. Voir Object.clone () pour plus de détails.

Remplacez clone () dans MyClass et faites implémenter la classe Cloneable interface.

3
Suraj Chandran

La subtilité est que la méthode clone() de MyClass est héritée et non définie dans MyClass. Donc MyClass peut invoquer clone() de l’objet car il est protected , mais MyClass n’a pas vraiment a a clone() de lui-même, donc TestSingleTon ne peut pas accéder à clone() de MyClass car il n’existe pas de méthode clone(). Bien qu'ils soient tous les deux dans le même package, vous devez définir une méthode clone() dans MyClass pour vous assurer qu'elle "possède" réellement la clone(). En passant, n'oubliez pas de mettre en œuvre l'interface Cloneable pour MyClass

1
spirit

Vous devez juste faire en sorte que Class implémente une interface clonable. Pas besoin de fournir une implémentation pour clone (). 

1
Swagatika

La méthode Object.clone() a un accès protégé, ce qui signifie it's visible to sub-classes and classes in the same package.

Il est bon d'avoir un constructeur copy pour copier manuellement l'objet.

/**
    Deep copy all the information from other to this
*/
public MyClass (MyClass  other) {
     this.id = other.id;
}

READ Pourquoi un constructeur de copies de Josh Bloch

0
prime

J'ai fait quelques tests sur ce code et voici mes conclusions:

Lorsqu'un membre protégé est hérité d'un paquet à l'autre, il devient membre privé de la classe héritée.

tandis que

lorsqu'un membre protégé est hérité dans le même package, il devient default membre de la classe héritée.

Dans votre exemple, clone () de la classe Object est hérité dans MyClass dans le package . La classe Object est dans le package Java.lang et MyClass dans le package GoodQuestions . La méthode clone () devient donc un membre privé de la classe MyClass. .

Cela explique pourquoi vous ne pouvez pas accéder à la méthode clone () à partir de la classe TestSingleTon.

0
FocalPoint

Pour que vous puissiez cloner MyClass, il doit implémenter l’interface Cloneable

0
Yanki Twizzy