仿制药的优秀设计

Jat*_*tin 8 java generics

我有一个设计问题.下面是TimeStamp接口

/**
 * <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();

}
Run Code Online (Sandbox Code Playgroud)

我基本上想要一个List只能包含TimeStamps的类.在列表中添加任何内容基本上取决于时间戳.应该如何成为我的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
  .....
}
Run Code Online (Sandbox Code Playgroud)

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

TimeList<DefaultTimeStamp> l = new TimeList<DefaultTimeStamp>();
Run Code Online (Sandbox Code Playgroud)

然后任何电话l.add(elem)都会期待TimeStamp<DefaultTimeStamp>哪个是错的.

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

什么应该是我的声明TimeList<Type>?最终它只是一个只包含TimeStamps的列表

dur*_*597 2

我不明白你为什么想做

TimeList<DefaultTimeStamp> l = new TimeList<DefaultTimeStamp>();
Run Code Online (Sandbox Code Playgroud)

如果您希望能够添加任何类型的TimeStamp<Long>. 如果您有某些特定于实现的原因这样做,上述方法将强制用户使用DefaultTimeStamp......但显然通常不会。

TimeList<TimeStamp<Long>> l = new TimeList<TimeStamp<Long>>();
DefaultTimeStamp dts = new DefaultTimeStamp(System.currentTimeMillis());
l.add(dts);
Run Code Online (Sandbox Code Playgroud)

应该可以正常工作!