8

我有一个设计问题。下面是时间戳接口

/**
 * <T> Type of Timestamp. For ex: Date, long, Calendar etc
 * 
 */
public interface TimeStamp<T> extends Comparable<TimeStamp<T>>
{

  /**
   * Returns the timestamp. 
   * @return 
   */
  public T getTimeStamp();

}

我基本上想要一个List只能包含时间戳的类。在列表中添加任何内容基本上取决于时间戳。我的 List 类声明应该如何。

如果我决定组合,代码将如下所示:

public class TimeList<T> implements List<TimeStamp<T>> 
{    
  private List<TimeStamp<?>> list = new ArrayList<TimeStamp<?>>();
  //other list methods who will return based on list above
  .....
}

但以上没有意义。例如,如果我有一个类DefaultTimeStamp implments TimeStamp<Long>并将 TimeList 实例化为

TimeList<DefaultTimeStamp> l = new TimeList<DefaultTimeStamp>();

然后anycall tol.add(elem)将期待一个TimeStamp<DefaultTimeStamp>错误的。

声明:public class TimeList<TimeStamp<T>> implements List<TimeStamp<T>>会给出编译时错误

my 的声明应该是什么TimeList<Type>?最终它只是一个仅包含时间戳的列表

4

4 回答 4

2

我不明白你为什么要这样做

TimeList<DefaultTimeStamp> l = new TimeList<DefaultTimeStamp>();

如果您希望能够添加任何类型的TimeStamp<Long>. 如果您有一些实现特定的理由,上述方式将迫使用户使用DefaultTimeStamp......但通常不会,很明显。

TimeList<TimeStamp<Long>> l = new TimeList<TimeStamp<Long>>();
DefaultTimeStamp dts = new DefaultTimeStamp(System.currentTimeMillis());
l.add(dts);

应该工作得很好!

于 2012-11-07T07:03:42.977 回答
0

尽管可以在 Java 中重复类似的操作,但在 scala 中可以通过以下方式实现:

trait TimeStamp[T <: Comparable[T]] extends Comparable[TimeStamp[T]]
{
def getTimeStamp:T;
def compareTo(to:TimeStamp[T]) =this.getTimeStamp.compareTo(to.getTimeStamp) 
}

TimeList 声明如下:

class TimeList[T <: TimeStamp[_]] extends ArrayList[T]
于 2012-11-29T08:28:38.583 回答
0
public class TimeList<T> extends ArrayList<TimeStamp<T>>{
}

而已。

于 2012-11-07T09:56:22.773 回答
0

无需将 TimeList 类设为通用。您可以简单地将 TimeList 声明为:

public class TimeList implements List<Timestamp> {

private List<Timestamp> list = new ArrayList<Timestamp>();

然后使用它

    TimeList l = new TimeList();

    l.add(new DefaultTimestamp1());
    l.add(new DefaultTimestamp2());

它完美地工作。您只能添加扩展Timestamp接口的对象。

于 2012-11-07T07:08:57.763 回答