在Java中,我们在处理多个接口时应该使用泛型吗?

时间:2019-02-13 15:16:01

标签: java generics

比方说,我分别为位置和时间定义了以下接口:

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 :(得分:0)

我非常怀疑这是一个巨魔问题,但是。在您的情况下,您有一个接受T的通用方法,因此不需要将整个类参数化,只需将方法参数化即可。

答案 1 :(得分:0)

您可以采用的一种方法是增强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有一种方法来确定调用客户端所需的子类类型。