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

У меня есть два простых Java-класса, и я пытаюсь понять больше о клонировании и о том, как приводить классы между уровнями. Это автомобиль суперкласса.

public class Vehicle implements Cloneable 
{
     public int x;

     public Vehicle(int y) { 
          x = y;
     }

     @Override public Object clone() { 
      Object result = new Vehicle(this.x);
      // Location "A"
      return result;
    }
}

А это подкласс Truck

public class Truck extends Vehicle 
{
   private int y;

   public Truck(int z) {
       super(z); 
       y = z;
   }

   @Override public Object clone() {
      Object result = super.clone();
      System.out.println(result.getClass());
      ((Truck) result).y = this.y; 
      return result; 
    }
}

Я пытаюсь получить копию Truck, используя суперкласс для клонирования, но проблемы с понижением рейтинга не разрешены. Я не совсем уверен, как это исправить или где ошибка.

Мне бы хотелось, чтобы: Грузовик a = новый Грузовик (1) и Грузовик b = a.clone () стали одним и тем же объектом.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Когда вы преобразуете из одного класса в другой, вы не меняете реальный объект, но делаете его доступным другим способом.

class A { public int x; }
class B extends A { public int y; }
A a = new A();
B aB = new B();
System.out.println(aB); // A@...
System.out.println(aB.y); // throws an error

Когда вы вызываете super.clone(), он создает экземпляр Vehicle, а экземпляры Vehicle не имеют y.

Вместо этого вы, вероятно, хотите инициировать объект, а не вызывать super.clone() в Truck.clone:

    return new Vehicle(this.y);
0 голосов
/ 18 сентября 2018

super.clone() возвращает объект типа Vehicle, а не Truck.Поэтому вы должны вызвать super(x) в конструкторе Truck.

public class Truck extends Vehicle 
{
   private int y;

   public Truck(int x, int y) {
       super(x); 
       this.y = y;
   }

   @Override public Object clone() {
      Object result = new Truck(this.x, this.y);
      return result; 
    }
}
0 голосов
/ 18 сентября 2018

Вы злоупотребляете clone().Вся реализация и копирование полей выполняется реализацией super при реализации Cloneable.Ваша реализация Vehicle должна выглядеть следующим образом:

@Override
public Vehicle clone() {
    try {
        return (Vehicle)super.clone();
    } catch (CloneNotSupportedException e) {
        throw new AssertionError();
    }
}

И вы можете переопределить ее в Truck следующим образом:

@Override
public Truck clone() {
    return (Truck)super.clone();
}
...