2012-11-07 135 views
8

我有一个设计问题。下面是时间戳Interface良好的泛型设计

/** 
* <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到l.add(elem)将期待一个TimeStamp<DefaultTimeStamp>这是错误的。

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

应该是什么我TimeList<Type>的声明?最终它只是只包含时间戳

+0

因为添加任何东西名单将取决于它的时间戳。 – Jatin

+1

你是否希望TimeList包含TimeStamp 对于任何T的特定T? –

+0

是的。这是计算所需的 – Jatin

回答

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); 

应该工作得很好!

+0

这正是我不想要的。我的意思是 - TimeList l = new TimeList (); – Jatin

+1

我知道你不想那么做,做底层的东西:) – durron597

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接口的对象。

+0

这是另一种解决方案。+1 – durron597

+1

但是这会产生几个编译时间警告。 – Jatin

+0

我没有警告,你能显示你得到的警告并说出你使用的是哪个jdk吗? – remigio

0
public class TimeList<T> extends ArrayList<TimeStamp<T>>{ 
} 

就是这样。

+0

基本相同如果他的列表方法只是基于他的'private'变量返回,那么这确实是一个好方法。但是,通过实现'List'接口,他隐藏了'ArrayList'中存在的方法,而不是'List'接口中的方法。 (如'ensureCapacity')。 –

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] 
+0

谁对Scala有什么看法? –