8

デザインの質問があります。以下は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();

}

基本的に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
  .....
}

しかし、上記は意味がありません。たとえば、クラスがDefaultTimeStamp implments TimeStamp<Long>あり、TimeList を次のようにインスタンス化するとします。

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

次に、への任意の呼び出しは、間違っているl.add(elem)a を期待します。TimeStamp<DefaultTimeStamp>

の宣言:public class TimeList<TimeStamp<T>> implements List<TimeStamp<T>>コンパイル時エラーが発生します

私の宣言は何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
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 に答える
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 に答える