Требует клонируемости параметров шаблона в Java
У меня есть этот универсальный класс Java, и я хотел бы его клонировать, чтобы выполнить его глубокое копирование. Теперь я подумал, что следующий код будет работать, но в методе clone() я не могу вызвать clone() для каждого члена, который не является примитивным типом. Я попытался запросить параметры для реализации интерфейса Cloneable, но id пока не работает, он не может вызвать [first/second].clone().
Буду признателен за любые предложения. Заранее спасибо.
[вот код]
public class Pair<F extends Cloneable, S extends Cloneable> implements Cloneable {
private F first;
private S second;
public Pair(F a, S b) {
first = a;
second = b;
}
public F getFirst() {
return first;
}
public S getSecond() {
return second;
}
public void setFirst(F first) {
this.first = first;
}
public void setSecond(S second) {
this.second = second;
}
@Override
public String toString() {
return "["+first+", "+second+"]";
}
@Override
public boolean equals(Object o) {
if(o == null) return false;
if(o == this) return true;
if(!getClass().getName().equals(o.getClass().getName())) return false;
Pair ref = (Pair)o;
return first.equals(ref.first) && second.equals(ref.second);
}
@Override
public int hashCode() {
int hash = 7;
hash = 61 * hash + Objects.hashCode(this.first);
hash = 61 * hash + Objects.hashCode(this.second);
return hash;
}
@Override
public Object clone() {
try {
Pair<F, S> cloned = (Pair<F, S>)super.clone();
cloned.first = (F)first.clone();
cloned.second = (S)second.clone();
return cloned;
}
catch(CloneNotSupportedException e) {
return null;
}
}
}
1 ответ
К сожалению, в Java нет общего интерфейса или супертипа для объектов с открытым доступом. .clone()
метод. Вы можете создать свой собственный интерфейс, который делает это, но только ваши собственные классы потенциально могут реализовать этот интерфейс, поэтому он все равно не будет работать для системных классов, которые могут иметь общедоступные .clone()
метод.