Реализация метода копирования класса, реализующего интерфейс - Java - PullRequest
0 голосов
/ 12 октября 2018

У меня странная ситуация, когда у меня есть класс TheClass, реализующий интерфейс TheInterface, и класс TheClass должен иметь метод copy () с возвращаемым типом TheInterface, и он должен делать поверхностную копию самого себя.При попытке вызвать мою функцию copy () и использовать ее, я получаю сообщение о несовместимости типов.Мне нужно сохранить тип возвращаемого значения метода copy () как есть.

Есть ли способ как это сделать?

Спасибо

class TheClass implements TheInterface,Cloneable {


private Set<Integer> set;

public TheClass(){
    set=new HashSet<Integer>();
}

public TheInterface copy() {
    TheInterface clone = this.clone();
    return clone;
}

protected A clone(){
    A clone;
    try
    {
        clone = (A) super.clone();
    }
    catch (CloneNotSupportedException e)
    {
        throw new Error();
    }
    return clone;
}

здесь я получаю ошибку несовместимых типов

public class Main  {
public static void main(String[] args) {
    TheClass class1 = new TheClass();
    TheClass class2 = class1.copy();

1 Ответ

0 голосов
/ 12 октября 2018

Частичное улучшение может заключаться в том, что copy() в TheClass возвращает TheClass, в то время как метод в интерфейсе все еще возвращает TheInterface.Это разрешено, поскольку возвращаемый тип не является частью сигнатуры метода Java.

Таким образом, вы можете сделать

TheClass class1 = new TheClass();
TheClass class2 = class1.copy();

Однако, если вы вызываете copy() для переменной (статической)введите TheInterface, вам все еще нужно присвоить его TheInterface (но это кажется логичным):

TheInterface class1 = new TheClass();
TheInterface class2 = class1.copy(); // cannot be TheClass in this case
...