В Java мы должны использовать дженерики при работе с несколькими интерфейсами? - PullRequest
0 голосов
/ 13 февраля 2019

Допустим, я определил следующие интерфейсы для позиции и времени соответственно:

public interface PositionBeep {

  double x();

  double y();

  PositionBeep generateNeighborAt(double angle, double distance);

}

public interface TimeBeep {

  long timestamp();

  void setTime(long timestamp);

}

и я хочу создать новый класс, который будет работать с универсальным расширением обоих этих типов:

class Sequence<T extends PositionBeep&TimeBeep> {

  T createSequence(T start, double angle) {
      T next = start.generateNeighborAt(angle,1000);
      next.setTime(start.timestamp()+1000);
      ...
  }

}

Я знаю, что это не работает, потому что generateNeighborAt возвращает PositionBeep, а не PositionBeep & TimeBeep.Проблема связана с моим выбором в разделении понятий времени и пространства, а затем в попытке снова объединить их с помощью обобщенных элементов, поэтому одним из возможных решений было бы объединение этих двух интерфейсов.Хотя я могу согласиться с этим, мне было интересно, существуют ли другие подходящие подходы, которые позволяют мне хранить эти две концепции отдельно и при этом иметь возможность реализовать метод 'createSequence' с обеими концепциями?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Один из подходов, который вы можете использовать, - это усовершенствование метода generateNeighborAt для обработки возврата подклассов PositionBeep.

public interface PositionBeep {

        double x();

        double y();

        <PB extends PositionBeep> PB generateNeighborAt(Class<PB> clazz, double angle, double distance);

      }

class Sequence<T extends PositionBeep&TimeBeep> {

          Class<T> type;

          T createSequence(T start, double angle) {
              T next = start.generateNeighborAt(type, angle,1000);
              next.setTime(start.timestamp()+1000);
              return null;
          }

        }

Причина, по которой я ввел параметр Class, заключается в том, чтобы убедиться, что generateNeighborAt имеетспособ определить, какой тип подкласса требует вызывающий клиент.

0 голосов
/ 13 февраля 2019

Я очень подозреваю, что это вопрос тролля, но тем не менее.В вашем случае у вас есть универсальный метод, который принимает T, и для этого вам не нужно делать параметризованный весь класс, просто сделайте метод параметризованным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...