Anonyme Klasse



  • Hallo,

    warum bekomme ich bei diesem Code

    public class test
    {
    	public static void main(String[] args)
    	{
    		Object original = new Cloneable() 
    		{
    			public Object clone() throws CloneNotSupportedException
    			{
    				return super.clone();
    			}
    		};
    		Object copy = original.clone();
    		System.out.println(original.equals(copy));
    	}
    }
    

    die Fehlermeldung

    test.java:12: error: clone() has protected access in Object
    		Object copy = original.clone();
    		                      ^
    1 error
    

    ? Ich hab clone doch public implementiert und es sollte über Polymorphismus gefunden werden? Und bei einem expliziten Cast

    Object copy = ((Cloneable)original).clone();
    

    sagt er mir, dass er clone gar nicht mehr findet?

    test.java:12: error: cannot find symbol
    		Object copy = ((Cloneable)original).clone();
    		                                   ^
      symbol:   method clone()
      location: interface Cloneable
    1 error
    

    Kann mir das jemand erklären? 🙂



  • Incocnito schrieb:

    Ich hab clone doch public implementiert und es sollte über Polymorphismus gefunden werden?

    Das ist nicht wie Polymorphie funktioniert. Du kannst Instanzen abgeleiteter Klassen als Instanzen der Basisklasse verwenden. Dabei beschränkt sich aber auch das Interface auf das der Basisklasse. Und als Object gibt es nur eine protected clone Methode.

    Incocnito schrieb:

    Und bei einem expliziten Cast

    Object copy = ((Cloneable)original).clone();
    

    sagt er mir, dass er clone gar nicht mehr findet?

    Vorneweg, der Cast ist schrecklich. Besser wäre original gleich als Callable zu definieren. Wäre der Code etwas länger und jemand steckt was anderes als ein Callable in original hast du einen Laufzeitfehler.

    Warum das nicht funktioniert ist relativ einfach. Cloneable hat keine public clone Methode:

    https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html schrieb:

    Note that this interface does not contain the clone method. Therefore, it is not possible to clone an object merely by virtue of the fact that it implements this interface.

    Damit ist man wieder bei der gleichen Situation wie oben. Du betrachtest deine Objektinstanz als Callable, bei dem es keine clone Methode gibt.

    Das es keine clone Methode gibt scheint wohl einer der vielen Designfehler beim Clone zu sein, weswegen meist davon abgeraten wird es zu verwenden, und stattdessen eher sowas wie Kopierkonstruktoren zu verwenden.


Log in to reply