требует клонируемости параметров шаблона в Java - PullRequest
0 голосов
/ 11 мая 2018

У меня есть этот родовой класс 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 Ответ

0 голосов
/ 27 мая 2018

К сожалению, в Java нет общего интерфейса или супертипа для объектов с открытым методом .clone(). Вы можете создать свой собственный интерфейс, который делает это, но только ваши собственные классы потенциально могут реализовать этот интерфейс, поэтому он все равно не будет работать для системных классов, которые могут иметь открытый метод .clone().

...