Не гарантируется, что тип T совпадает с типом самого класса, поэтому вам нужно добавить приведение к строке, которая не компилируется:
public T getRoot() {
if (parent == null) {
return (T)this;
} else {
return getParent();
}
}
Чтобы привести простой пример кода, который будет содержать ошибку ввода:
public class GoodNode extends TreeNode<GoodNode, Integer> {
public GoodNode(GoodNode parent, Integer data) {
super(parent, data);
}
}
public class BadNode extends TreeNode<GoodNode, Integer> {
public BadNode(GoodNode parent, Integer data) {
super(parent, data);
}
public static void main(String[] args) {
GoodNode node = new BadNode(null, null).getRoot();
}
}
Запуск BadNode.main вызывает ошибку при печати, поскольку BadNode (null, null) .getRoot () возвращает объект класса BadNode (так как у него нет родителя), но поскольку BadNode расширяет TreeNode , тип возврата getRoot () - это GoodNode. Поскольку BadNode не может быть приведен к GoodNode, есть исключение приведения класса:
Exception in thread "main" java.lang.ClassCastException: BadNode cannot be cast to GoodNode
at BadNode.main(BadNode.java:7)