java方法编译并使用传递的变量类型错误
下面是我正在测试的部分代码:
interface sample
{
Vector Sum(Vector vec);
Vector Subtraction(Vector vec);
int Product(Vector vec);
boolean Compare(Vector vec);
String ToString();
}
abstract class Vector implements sample
{
int[] coordinates;
public Vector (int[] coordinates)
{
this.coordinates=coordinates;
}
}
abstract Vector resVec();
public boolean Compare(Vector vec)
{
if (this.coordinates.length == vec.coordinates.length)
{
for (int i = 0; i<vec.coordinates.length; i++)
{
if (this.coordinates[i] == vec.coordinates[i])
continue;
else return false;
}
}
else
{
throw new ArithmeticException("Can't compare vectors of different length");
}
return true;
}
下面是我调用方法的类: 1)
class Vector3D extends Vector
{
public Vector3D(int n1,int n2,int n3)
{
super(new int[]{n1,n2,n3});
}
public Vector3D resVec()
{
Vector3D resVec = new Vector3D(0,0,0);
return resVec;
}
public boolean Compare(Vector3D vec)
{
return super.Compare(vec);
}
2)
class VectorND extends Vector
{
public VectorND(int...n)
{
super(n);
}
public VectorND resVec()
{
VectorND resVec = new VectorND();
return resVec;
}
public boolean Compare(VectorND vec)
{
return super.Compare(vec);
}
}
所以问题是,出于某种原因,如果我主要写这样的东西:
public class main {
public static void main(String[] args)
{
Vector3D B = new Vector3D(1,-3,3);
VectorND A = new VectorND(1,-3,3);
System.out.println(A.Compare(B));
}
}
它可以完美地工作并返回true,而它本应该编写一个异常,在从A调用Compare时,VectorND是预期的。会出现什么问题
# 1 楼答案
问题是您没有在
VectorND
和Vector3D
中重写基类Vector
的Compare()
方法。相反,您正在声明新方法,这些方法在子类中接受相同类型的对象(VectorND
或Vector3D
)。基类的原始Compare()
方法在子类中仍然可用,当您调用A.Compare(B)
时,get调用的就是这个方法更清楚地说,你有
所以当你打电话的时候
在类
VectorND
中没有Compare(Vector3D)
声明,您真正做的是调用因为
A
和B
都是从基类Vector
派生的如果您真的想用子类中的方法覆盖
Vector
中的Compare
方法,则需要在子类中相同地声明它们(即使用相同类型的参数)如果真的希望该方法在指定的情况下抛出异常,则需要使用
instanceof
运算符显式检查Vector
的类型,如果它不是同一类型,则抛出异常@Override
注释表示您打算重写基类中的方法。如果基类中没有匹配方法,例如编译器/IDE将发出一个错误,通知您没有重写任何内容(因为
Vector
类没有Compare(Vector3D vec)
方法)