Интерфейс Java расширяет Cloneable - PullRequest
2 голосов
/ 10 мая 2011

Я не понимаю, почему мы не можем сделать следующее:

interface MyInterface extends Cloneable {}

class myClazz implements MyInterface {
    public Object clone() { return null; }
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.clone(); // IMPOSSIBLE
    }
}

Но это будет нормально работать

interface Misc{
    public void testM();
}

interface MyInterface extends Misc{}

class myClazz implements MyInterface {
    public void testM() {}
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.testM(); // OK
    }
}

Что случилось с Cloneable?

Спасибо

Ответы [ 3 ]

7 голосов
/ 10 мая 2011

Интерфейсы Cloneable не имеют методов.
Это просто интерфейс маркера, который проверяет метод base Object.clone (который protected).

Если вы хотите clone метод, вам нужно объявить его самостоятельно.

6 голосов
/ 10 мая 2011

Это связано с тем, что интерфейс Cloneable является не обычным интерфейсом, а более или менее интерфейсом тегирования, который гарантирует JVM, что метод clone класса, который его реализует, является допустимым и фактически работает.

Как указано в документации, интерфейс Cloneable не объявляет сигнатуру метода clone. Этот метод по своей природе наследуется в любом классе, который вы объявляете из класса Object, но по умолчанию он равен protected. Вот почему вы должны ослабить это ограничение, сделав его public в среднем интерфейсе MyInterface, который вы объявляете.

Взгляните на эту подсказку, приведенную в Java doc:

Обратите внимание, что этот интерфейс не содержит метод клонирования. Следовательно, невозможно клонировать объект только в силу того факта, что он реализует этот интерфейс. Даже если метод клона вызывается рефлексивно, нет никаких гарантий, что он будет успешным.

1 голос
/ 10 мая 2011

Это просто потому, что clone () не является общедоступным в Object.Если вы объявите public Object clone() в своем интерфейсе - другими словами, если вы сделаете свой первый пример похожим на второй - тогда ваш первый пример будет работать.

...