Ahh, ok. Danke für die Aufklärung. Ich hatte kurz den Verdacht, dass es die "alte" Problematik ist, dass dies teilweise falsch/oft gemacht wurde.
Einige machen das halt falsch und dann bekommt man auch ClassCastException Probleme. Wenn ich also in A.clone() nicht super.clone() aufrufe sondern einfache in new A() erzeuge ... dann wird B von A abgeleitet, B.clone ruft super.clone() auf aber bekommt dann natürlich ein A und kein B und der Cast auf B schlägt fehl.
So ein clone greift halt immer auf ein super.clone() zurück und das landet dann am Ende bei Object.clone(), welches dann eine neue Instanz der Klasse selbst erzeugt (also bei B.clone() wird das ein B. A bekommt dann auch schon ein B, aber das kann man in A casten....
Also in ArrayList hat man dann einen cast auf ArrayList von eben super.clone() wenn man sich das einmal anschaut.
So man klare Typen hat, dann funktioniert das schon recht gut. Aber ich gebe zu, dass ich es nicht gut durchdacht habe und es kam mir halt in den Sinn - habe ich halt in der Vergangenheit auch schon Dinge mit machen dürfen. Aber der Hauptgrund ist für mich, dass man ja mit Interfaces arbeitet (also in der Regel List statt ArrayList) und wenn man dann neue Instanzen erzeugt, dann greift man halt auf konkrete Klassen zurück. Und da ist Dein Weg genau der, der halt genommen wird.
Bei einer List wäre ansonsten der Weg List -> Cloneable -> clone() -> List
Und hätte dann die Einschränkung, dass es nur für List Implementationen funktionieren würde, die auch Cloneable implementieren.
Also zum einen Aufwändig und zum anderen stark eingeschränkt ...