Когда вы сказали "((Object) this).clone()
", вы получили доступ к своему собственному объекту через его объект суперкласса. Вы выполнили расширенное преобразование в Объект. Затем код пытается вызвать клон на объекте.
Но, как вы заметили, клон - это защищенный метод, означающий, что только если ваш объект находится в том же пакете java.lang, он сможет получить доступ к методу клонирования OBJECT.
Когда вы говорите this.clone, ваш класс расширяет Object и, таким образом, имеет доступ к переопределению или использованию clone напрямую через модификатор защищенного класса из-за наследования. Но это не меняет реализацию объекта.
Говоря ((Object) yourObject), вы получаете что-то, что доступно только через класс Object. Только открытые методы класса Object доступны вне пакета java.lang, поэтому вы получаете исключение времени компиляции, потому что компилятор знает это.
Говоря this.clone (), вы вызываете метод клона вашего объекта, который он получил посредством наследования через Object, и теперь можете его вызывать, поскольку он становится частью вашего пользовательского подкласса.