Конфликт переопределения 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
,