2012-11-07 72 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有什麼看法? –