Я пишу программу, которую наш профессор дал нам в качестве домашнего задания.
У меня есть класс с именем Car, который имеет два закрытых реальных члена x и y, которые должны представлять координаты автомобиля в координатной плоскости, и я хотел реализовать интерфейс с именем MyInterface, в котором я объявил метод public boolean compare(Object t). Было заявлено, что это должно быть Object t, а не что-то еще, чтобы я мог реализовать интерфейс в нескольких классах (часть домашнего задания). Java — это язык программирования, о котором идет речь.
Та часть кода, которая вызывает проблемы, выглядит так:
public interface MyInterface {
public boolean compare(Object t);
}
public class Car implements MyInterface{
private double x, y;
@Override
public boolean compare(Car t) {
double curdist = Math.sqrt(this.x*this.x + this.y*this.y);
double givdist = Math.sqrt(t.x*t.x + t.y*t.y);
if (curdist < givdist) return true;
else return false;
}
}
Мой метод compare должен вычислить расстояния от точки (0,0) для текущего автомобиля и данного автомобиля и сравнить два расстояния. Если расстояние до текущего автомобиля (curdist) меньше расстояния до заданного автомобиля (givdist) до (0,0), compare возвращает значение true, в противном случае — значение false.
У меня вопрос, как мне правильно реализовать этот метод в классе Car? Я пробовал несколько вещей, но ни одна из них, похоже, не сработала. Любая помощь приветствуется, потому что я новичок в объектно-ориентированном программировании. Заранее спасибо.
@amseager Я не думаю, что он скомпилируется.
Профессор написал в нашей домашней работе, что наш интерфейс должен иметь Object в качестве параметра метода, потому что нам нужно реализовать один и тот же интерфейс в трех разных классах (что, по сути, является тремя разными упражнениями). На прошлом занятии он учил нас интерфейсам, кастингу и многому другому, так что, думаю, это его способ увидеть то, чему мы научились B)
@amseager Ковариантные типы возвращение существуют в Java, но не ковариантные типы параметров.
Для этого используйте instanceof и кастинг.
О да. Мне действительно нужно пойти спать :) извините
@amseager Я уверен, что он не скомпилируется, но я даже не пытался, потому что не понял ошибку, которую он выдает. Я написал сеттеры и геттеры, это не проблема, мне просто было интересно, как я могу реализовать метод сравнения в моем классе Car, если в интерфейсе параметр метода является объектом
@aglassman Я пробовал кастовать, но не могу понять, где именно.
Я думаю, что ваша реализация неверна. Нельзя указать Car t, должно быть Object t, тогда бы сделали Car car = (Car)t;
Это еще один способ решить эту проблему, @aglassman. Спасибо за ваше предложение, оно очень ценится.




Если вы должны иметь Object в качестве типа параметра для compare, вы должны сначала проверить класс передаваемого параметра, чтобы убедиться, что это Car.
Измените аргумент compare на Object в вашем классе Car. Тогда аннотация @Override определит, что метод правильно переопределяет метод экземпляра, и вы не получите ошибку компиляции. Используйте оператор instanceof, чтобы определить, является ли tCar. Вы можете решить бросить IllegalArgumentException, если это не Car, или если это null. Затем вы можете привести его к Car и продолжить логику вашего метода.
Даже если вам нужно сделать так, чтобы для вашего класса потребовалось Object, в целом лучший способ сделать это — использовать дженерики. Здесь это ответит на вопрос «С чем этот класс сопоставим к?». Если вы рассмотрели дженерики, то вы можете понять класс, который определяется как MyInterface<T>. Метод compare будет принимать параметр типа T. Это позволяет реализовать метод в Car с параметром типа Car при условии Car implements MyInterface<Car>. Это похоже на существующий интерфейс Comparable, встроенный в Java.
Я не думаю, что мы рассмотрели дженерики, но первая часть вашего ответа решит то, что я искал. Спасибо вам большое за ваше время!
Ваш параметр метода интерфейса имеет тип Object, а ваш параметр для метода сравнения в классе Car имеет тип Car. Почему? :)