Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Cloneable


Автор: Fieral 9.6.2009, 19:09
например:
я написал инетфейс MyList<E> extends Cloneable
затем написал класс MyListClass<E> implements MyList<E>,Cloneable у которого даже есть метод public Object clone()

а теперь я хочу скопировать:

MyList<Integer> value;

Код

public MyList<Integer> getValueCopy() {
       return value.clone();
}


и тут внезапно выясняется что сделать это нельзя потому что у интерфейса Cloneable вообще нет никаких методов.

тоесть придётся писать свой интерфейс MyCloneable с блекджеком и шлюхами в котором этот метод есть, и расширять MyList от него

зачем вообще тогда нужен java.lang.Cloneable?

Автор: Girin 9.6.2009, 19:30
Cloneable это интерфейс-маркер, служит гарантией того что в классе реализующем данный интерфейс будет переопределен метод clone(). В классе Object метод clone() является защищенным, т.е. использовать непосредственно его нельзя. Такие интерфейсы еще используются для проверки типа с помощью оператора instanceof
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Cloneable.html

Автор: Fieral 9.6.2009, 19:38
ну а почему java.lang.Cloneable не выгдядит так?

Код

public class Cloneable{

              public Object Clone();

}


Добавлено через 58 секунд
это както служит большей гарантией того что в классе реализующем данный интерфейс будет переопределен метод clone() чем:

Код

public class Cloneable{

  
}


Автор: SoulKeeper 9.6.2009, 19:42
Спросите у Sun

Автор: Fieral 10.6.2009, 14:17
сначала у меня была версия что логика работы Clonable устроена по аналогии с Serializable:
где класс сериализуем <=> он помечен как Serializable и содержит только Serializable поля

но там есть некий внешний сериализатор, а тут? как склонировать класс "спрятанный" за интерфейс?

Автор: serger 10.6.2009, 14:37
Тут мысли:
http://xpoint.ru/forums/programming/java/thread/36462.xhtml#334230

Тут разжёвано:
http://www.uic.rsu.ru/doc/programming/java/TIJ2e.ru/AppendixA.html

Автор: LSD 10.6.2009, 17:14
Цитата(serger @  10.6.2009,  14:37 Найти цитируемый пост)
Тут мысли:

Тут разжёвано:

Что-то я там не увидел ответа на вопрос:
Цитата(Fieral @  9.6.2009,  19:38 Найти цитируемый пост)
ну а почему java.lang.Cloneable не выгдядит так?


Мы сделали наш класс клонируемым, по контракту мы должны сделать метод clone() - public. Так почему нельзя было добавить clone() в интерфейс, чтобы можно было писать:
Код

if(a instanceof Cloneable)
{
  Cloneable c = (Cloneable) a;
  A a = (A) c.clone();
  ...
}


Мое личное мнение, что это просто недоработка Sun. Сейчас же добавить этот метод нельзя, т.к. может перестать работать куча старого кода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)