2012-11-07 4 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 वर्ग है कि केवल timestamps शामिल कर सकते हैं करना चाहते हैं है। सूची में कुछ भी जोड़ना मूल रूप से टाइमस्टैम्प पर निर्भर करेगा। मेरी सूची वर्ग घोषणा कैसे होनी चाहिए।

अगर मैं रचना के लिए निर्णय लेते हैं, कोड तरह दिखेगा:

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<DefaultTimeStamp> l = new TimeList<DefaultTimeStamp>(); 

रूप TimeList का दृष्टांत तब l.add(elem) को Anycall एक TimeStamp<DefaultTimeStamp> जो गलत है उम्मीद होगी।

की घोषणा: public class TimeList<TimeStamp<T>> implements List<TimeStamp<T>> संकलन देना होगा टाइम त्रुटि

क्या मेरी TimeList<Type> की घोषणा किया जाना चाहिए? अंत में यह सिर्फ एक ही timestamps

+0

क्योंकि सूची में कुछ भी जोड़ने अपने टाइमस्टैम्प पर निर्भर करेगा:

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

और TimeList घोषणा इस प्रकार है । – Jatin

+1

क्या आप टाइमलिस्ट को टाइमस्टैम्प को किसी भी टी के लिए विशेष टी के लिए रखना चाहते हैं? –

+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

यह वही है जो मैं नहीं चाहता था। मेरा मतलब है- टाइमलिस्ट l = नया टाइमलिस्ट (); – Jatin

+1

मुझे पता है कि आप ऐसा नहीं करना चाहते हैं, नीचे की बात करें :) – durron597

0

टाइमलिस्ट क्लास जेनेरिक बनाने की कोई आवश्यकता नहीं है। आप साधारण रूप 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

मुझे कोई चेतावनी नहीं थी, क्या आप जो चेतावनियां प्राप्त करते हैं उन्हें दिखा सकते हैं और कह सकते हैं कि आप किस जेडीके का उपयोग कर रहे हैं? – remigio

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

यही है।

+0

जैसा ही है यदि उसकी सूची विधियां केवल अपने' निजी 'चर के आधार पर लौट रही हैं, तो यह वास्तव में एक अच्छा तरीका है। हालांकि, 'सूची' इंटरफ़ेस को कार्यान्वित करके वह छुपा रहा है जो 'ArrayList' में मौजूद है और 'सूची' इंटरफ़ेस में नहीं है। (जैसे 'सुनिश्चित क्षमता')। –

0

समान हालांकि जावा में दोहराया जा सकता है, स्केला में एक के बाद यह कर सकते हैं:

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

स्कैला के बारे में कुछ भी किसने कहा? –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^