Java 尽管显式使用了@Override,但子类方法并未被覆盖
Java subclass methods are not overriding despite explicit use of @Override
我正在尝试制作一个抽象算法 class 以使用不同的启发式进行明智的搜索。我的想法是让不同的 subclasses 覆盖默认的 heuristic() 方法,但是当我调用 subclasses.
时动态绑定似乎不起作用
在astar.java:
public interface Astar {
abstract String heuristic();
}
在search.java
public class Search implements Astar {
public String heuristic() { return "default heuristic"; }
}
在EuclidianSearch.java:
public class EuclidianSearch extends Search {
@Override
public String heuristic() { return "Euclidian"; }
}
在ChebyshevSearch.java:
public class ChebyshevSearch extends Search {
@Override
public String heuristic() { return "Chebyshev"; }
}
在main.java:
EuclidianSearch e_search = null; ChebyshevDistance ch_search = null;
Search[] SearchObjects = {e_search, ch_search};
for(Search so : SearchObjects) {
System.out.println(so.heuristic());
}
当运行时,显示:
default heuristic
default heuristic
我根据 Search
定义数组,这样我就可以更灵活:最终,我想要五个或更多不同的启发式方法。为什么 subclass 的 heuristic()
方法不覆盖 superclass 的方法?
您将在调用 so.heuristic() 时得到 NullPointerException,因为您没有实例化 class,请使用这些代码:
EuclidianSearch e_search = new EuclidianSearch();
ChebyshevDistance ch_search = new ChebyshevDistance();
但这还不足以解决您的问题,您应该通过不同的 classes 实现 AStart 接口。不要忘记实现接口的 class 应该实现所有接口方法。否则,您应该定义一个抽象 class 来仅定义一些方法并覆盖其他 class 中的剩余方法,并扩展您之前的 class.
public class Search implements Astar {
@Override
public String heuristic() { return "default heuristic"; }
}
我正在尝试制作一个抽象算法 class 以使用不同的启发式进行明智的搜索。我的想法是让不同的 subclasses 覆盖默认的 heuristic() 方法,但是当我调用 subclasses.
时动态绑定似乎不起作用在astar.java:
public interface Astar {
abstract String heuristic();
}
在search.java
public class Search implements Astar {
public String heuristic() { return "default heuristic"; }
}
在EuclidianSearch.java:
public class EuclidianSearch extends Search {
@Override
public String heuristic() { return "Euclidian"; }
}
在ChebyshevSearch.java:
public class ChebyshevSearch extends Search {
@Override
public String heuristic() { return "Chebyshev"; }
}
在main.java:
EuclidianSearch e_search = null; ChebyshevDistance ch_search = null;
Search[] SearchObjects = {e_search, ch_search};
for(Search so : SearchObjects) {
System.out.println(so.heuristic());
}
当运行时,显示:
default heuristic
default heuristic
我根据 Search
定义数组,这样我就可以更灵活:最终,我想要五个或更多不同的启发式方法。为什么 subclass 的 heuristic()
方法不覆盖 superclass 的方法?
您将在调用 so.heuristic() 时得到 NullPointerException,因为您没有实例化 class,请使用这些代码:
EuclidianSearch e_search = new EuclidianSearch();
ChebyshevDistance ch_search = new ChebyshevDistance();
但这还不足以解决您的问题,您应该通过不同的 classes 实现 AStart 接口。不要忘记实现接口的 class 应该实现所有接口方法。否则,您应该定义一个抽象 class 来仅定义一些方法并覆盖其他 class 中的剩余方法,并扩展您之前的 class.
public class Search implements Astar {
@Override
public String heuristic() { return "default heuristic"; }
}