Проблема в том, что вы не переопределяете метод Compare()
базового класса Vector
в VectorND
и 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)
и в классе VectorND
не объявлено Compare(Vector3D)
, то вы действительно звоните
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
указывает, что вы намеревались переопределить метод в базовом классе.Если в базовом классе нет подходящего метода, например, если вы попытаетесь выполнить
@Override
public boolean Compare(Vector3D vec)
, компилятор / IDE выдаст ошибку, чтобы уведомить вас, что вы ничего не переопределяете (поскольку Vector
класс не имеет Compare(Vector3D vec)
метода).