2012-11-07 16 views
8

Tasarım sorum var. Aşağıda TimeStamp ArayüzJenerikte İyi Tasarım

Ben temelde sadece damgaları içerebilir bir List sınıf var istiyorum
/** 
* <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(); 

} 

olduğunu. Listeye herhangi bir şey eklemek temel olarak zaman damgasına bağlı olacaktır. Liste sınıf beyannamem nasıl olmalı? Ben kompozisyon için karar verirseniz

, kod gibi görünecektir:

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 
    ..... 
} 

Ama yukarıda mantıklı değil. Örneğin ben bir sınıf DefaultTimeStamp implments TimeStamp<Long> varsa ve sonra yanlış bir TimeStamp<DefaultTimeStamp> bekliyoruz l.add(elem) için Anycall

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

olarak TimeList örneğini.

beyanı: public class TimeList<TimeStamp<T>> implements List<TimeStamp<T>> derlemek benim TimeList<Type> beyanı olmalıdır kaçta hatası

verecekti? Sonuçta bu size TimeStamp<Long> her türlü eklemek mümkün olmasını istiyorsanız

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

yapmak istiyorum neden anlamıyorum sadece zaman damgalarını

+0

Çünkü şu şekildedir:

trait TimeStamp[T <: Comparable[T]] extends Comparable[TimeStamp[T]] { def getTimeStamp:T; def compareTo(to:TimeStamp[T]) =this.getTimeStamp.compareTo(to.getTimeStamp) } 

Ve TimeList beyanıdır . – Jatin

+1

TimeList'in herhangi bir T için herhangi bir T için TimeStamp 'u içermesini ister misiniz? –

+0

Evet. Bu hesaplamalar için gereklidir – Jatin

cevap

2

içeren bir listedir. Yukarıdaki yol, kullanıcıları uygulama yapmak için belirli bir nedeniniz varsa DefaultTimeStamp'u kullanmaya zorlardı, ancak genellikle değil.

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

Sadece iyi çalışır!

+0

Tam olarak istemedim. Yani-TimeList l = yeni TimeList (); – Jatin

+1

Bunu yapmak istemediğini biliyorum, altını yap :) – durron597

0

TimeList sınıfını jenerik yapmaya gerek yoktur. Basit olarak TimeList olduğuna dair karar:

public class TimeList implements List<Timestamp> { 

private List<Timestamp> list = new ArrayList<Timestamp>(); 

ve sonra

TimeList l = new TimeList(); 

    l.add(new DefaultTimestamp1()); 
    l.add(new DefaultTimestamp2()); 

Mükemmel çalışıyor kullanın. Yalnızca Timestamp arayüzünü genişleten nesneleri ekleyebilirsiniz.

+0

Bu diğer çözüm.+1 – durron597

+1

Ancak bu, birkaç derleme zamanı uyarısı verir. – Jatin

+0

Hiçbir uyarı almadım, aldığınız uyarıları gösterebilir ve hangi jdk kullanıyorsunuz? – remigio

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

İşte bu kadar. benzer olsa

+0

ile aynıdır. Onun liste yöntemleri sadece '' private' değişkenine göre dönüyorsa, bu gerçekten iyi bir yoldur. Ancak, 'List' arayüzünü uygulayarak, "Liste" arayüzünde değil, "ArrayList" te bulunan yöntemleri gizliyor. ('GuaranteeCapacity' gibi). –

0

biri bunu yapabilir scala içinde, Java tekrar edilebilir: Listedeki şey eklemeden kendi damgası bağlıdır

class TimeList[T <: TimeStamp[_]] extends ArrayList[T] 
+0

Scala hakkında kim bir şey söyledi? –