这是我正在测试的代码的一部分:
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);
}
}
所以问题是由于某种原因,如果我在main中写这样的话:
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,同时它应该编写了一个异常,即VectorND在A进行的Compare调用中应该被期望。这可能是什么问题?
答案 0 :(得分:1)
问题是您没有覆盖Compare()
和Vector
中基类VectorND
的{{1}}方法。相反,您要声明在子类中采用相同类型(Vector3D
或VectorND
)对象的新方法。子类中仍然可以使用基类的原始Vector3D
方法,而调用Compare()
时将调用该方法。
为了更加清楚,您有
A.Compare(B)
因此,当您致电
Vector{
public boolean Compare(Vector vec){ ... }
}
class Vector3D extends Vector {
public boolean Compare(Vector vec){ ... }
public boolean Compare(Vector3D vec){ ... }
}
class VectorND extends Vector {
public boolean Compare(Vector vec){ ... }
public boolean Compare(VectorND vec){ ... }
}
并且在类A.Compare(B)
中没有声明Compare(Vector3D)
,您实际上正在调用
VectorND
因为Vector.Compare(Vector)
和A
都是从基类B
派生的。
如果您确实想用子类中的方法覆盖Vector
中的Compare
方法,则需要在子类中声明它们相同(即,使用相同类型的参数)。
如果您真的希望该方法在指定的情况下引发异常,则需要使用Vector
运算符来显式检查Vector
的类型,如果类型不同,则抛出异常。
instanceof
public class Vector3D extends Vector {
@Override
public boolean Compare(Vector vec){
if( !(vec instanceof Vector3D) )
throw new IllegalArgumentException("Vector3D can only be compared to Vector3D!");
// Compare and return true or false
}
}
批注指示您打算覆盖基类中的方法。如果基类中没有匹配方法,例如,如果您尝试这样做
@Override
编译器/ IDE将发出错误,以通知您您没有覆盖任何内容(因为@Override
public boolean Compare(Vector3D vec)
类没有Vector
方法)。