2012-11-07 14 views
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クラスを持つようにしたいです。リストに何かを追加するのは基本的にタイムスタンプに依存します。どのように私のリストクラスの宣言をする必要があります。

私は、組成物のために決定した場合、コードは次のようになります。

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>を持っている場合。そして、間違っているTimeStamp<DefaultTimeStamp>を期待していますl.add(elem)にエニコール

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

としてTimeListをインスタンス化します。

の宣言:public class TimeList<TimeStamp<T>> implements List<TimeStamp<T>>は私のTimeList<Type>の宣言がどうあるべきか、コンパイル時にエラーに

を与えるだろうか?最終的に、それはあなたがTimeStamp<Long>のいずれかの種類を追加することができるようにしたい場合は

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

をしたい理由を私は理解していないだけで、タイムスタンプ

+0

リストには何も追加すると、そのタイムスタンプに依存しているため。 – Jatin

+1

TimeListにタイムスタンプが含まれていますか? –

+0

はい。これは計算に必要です – Jatin

答えて

2

を含むリストだけです。上記の方法では、実装に固有の理由がある場合は、ユーザにDefaultTimeStampを使用させることになりますが、通常はそうではありません。

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

正常に動作するはずです。

+0

それはまさに私が欲しくないことでした。私は意味 - TimeList l =新しい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'インターフェースを実装することによって、' List'インターフェースではなく 'ArrayList'に存在するメソッドを隠しています。 ( '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について誰が言ったのですか? –

関連する問題