我有一个名为 ScalarObject 的类和一个继承自 ScalarObject 的名为 Variable 的类。我在 ScalarObject 上定义了“equals”,它总是返回 false,并且在表示它们的字符串相等时返回 true 的 Variable。
以下代码:
ScalarObject a1 = new Variable("a");
ScalarObject a2 = new Variable("a");
System.out.println(a1.equals(a2));
返回假。以下代码:
Variable a1 = new Variable("a");
Variable a2 = new Variable("a");
System.out.println(a1.equals(a2));
返回真。以下代码:
ScalarObject a1 = new Variable("a");
ScalarObject a2 = new Variable("a");
System.out.println(((Variable) a1).equals(((Variable) a2)));
也返回真。问题是我还有其他类也派生自 ScalarObject。我的程序对象的某些部分被声明为 ScalarObject 类型,但可能是从它派生的任何类的成员,因此将 ScalarObject 对象转换为派生类型将不起作用。例如,在我的程序的一部分中,我有:
protected void neighbor_simplify(LinkedList<ScalarObject> L, char op) {
...
if(n1 instanceof Variable && n2 instanceof Variable) {
System.out.println(((Variable) n1).getSymbol());
System.out.println(((Variable) n2).getSymbol());
}
if(n1.equals(n2)) { // x+x=2*x
System.out.println("B ");
并且程序打印出“x”两次但不打印“B”。变量 n1 和 n2 来自链表“L”。我怀疑程序正在调用“ScalarObject.equals()”(它总是返回 false)而不是“Variable.equals()”。将 n1 和 n2 转换为变量类型的问题在于,n1 和 n2 可能是其他一些类的实例,这些类也派生自 ScalarObject。如何让程序从派生类而不是基类中调用成员,即使它被声明为基类?
我在 Windows Vista 上使用 NetBeans 6.9.1。
在网络上搜索已将我带到http://wiki.answers.com/Q/Can_a_base_class_access_members_of_a_derived_class,它指出在 Java 中,当使用 @Override 表示法时,基类可以访问派生类的成员。但是,当我将 @Override 添加到 Variable.equals() 时,我收到一条错误消息,指出该方法不会覆盖超类型中的方法,可能是因为符号不同。ScalarObject.equals() 接受一个 ScalarObject 类型的参数,而 Variable.equals() 接受一个变量类型的参数。