Как мне правильно реализовать интерфейс с методом, который имеет Object в качестве аргумента?

Я пишу программу, которую наш профессор дал нам в качестве домашнего задания.

У меня есть класс с именем 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? Я пробовал несколько вещей, но ни одна из них, похоже, не сработала. Любая помощь приветствуется, потому что я новичок в объектно-ориентированном программировании. Заранее спасибо.

Ваш параметр метода интерфейса имеет тип Object, а ваш параметр для метода сравнения в классе Car имеет тип Car. Почему? :)

Sneh 26.02.2019 23:12

@amseager Я не думаю, что он скомпилируется.

Sneh 26.02.2019 23:15

Профессор написал в нашей домашней работе, что наш интерфейс должен иметь Object в качестве параметра метода, потому что нам нужно реализовать один и тот же интерфейс в трех разных классах (что, по сути, является тремя разными упражнениями). На прошлом занятии он учил нас интерфейсам, кастингу и многому другому, так что, думаю, это его способ увидеть то, чему мы научились B)

lukab99 26.02.2019 23:17

@amseager Ковариантные типы возвращение существуют в Java, но не ковариантные типы параметров.

rgettman 26.02.2019 23:17

Для этого используйте instanceof и кастинг.

aglassman 26.02.2019 23:18

О да. Мне действительно нужно пойти спать :) извините

amseager 26.02.2019 23:18

@amseager Я уверен, что он не скомпилируется, но я даже не пытался, потому что не понял ошибку, которую он выдает. Я написал сеттеры и геттеры, это не проблема, мне просто было интересно, как я могу реализовать метод сравнения в моем классе Car, если в интерфейсе параметр метода является объектом

lukab99 26.02.2019 23:19

@aglassman Я пробовал кастовать, но не могу понять, где именно.

lukab99 26.02.2019 23:20

Я думаю, что ваша реализация неверна. Нельзя указать Car t, должно быть Object t, тогда бы сделали Car car = (Car)t;

aglassman 26.02.2019 23:25

Это еще один способ решить эту проблему, @aglassman. Спасибо за ваше предложение, оно очень ценится.

lukab99 26.02.2019 23:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
10
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы должны иметь 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.

Я не думаю, что мы рассмотрели дженерики, но первая часть вашего ответа решит то, что я искал. Спасибо вам большое за ваше время!

lukab99 26.02.2019 23:25

Другие вопросы по теме