Конфликт переопределения Java - то же имя с другим типом возвращаемого значения

Я пытался создать класс, который расширил класс File (java.io.File) и реализовать интерфейсTreeNode, как показано ниже:

public class mTreeNode extends File implements TreeNode{}

и попытался реализовать методы TreeNode, но возник конфликт.

public String getParent(){} в классе File есть конфликт с public TreeNode getParent() на интерфейсе TreeNode по типу возврата.

Как мы можем решить это? (например, почему нельзя использовать класс Object для возвращаемого типа!)

Наконец, я решил использовать файловый объект в своем классе.

2 ответа

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

Вы можете прочитать больше об этом здесь.

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

например

class Foo {
    public String toString() {
        return "foo";
    }
}

interface Interface {
    Foo getFoo();    
}

class Bar extends Foo {
    public String toString() {
        return "bar";
    }
}

class Concrete implements Interface {
    public Bar getFoo() {  // <============= Covariant return type
        return new Bar();
    }
}

public class Example {
    public static void main(String[] args) {
        System.out.println(new Concrete().getFoo());
    }
}

Класс напечатает bar,

Другие вопросы по тегам