2017-10-24 21 views
5

मैं समय श्रृंखला डेटा का प्रतिनिधित्व करने के लिए एक वर्ग है, लिख रहा हूँ यानी मूल रूप से एक सामान्य प्रकार Tजेनेरिक पैरामीटर

interface TimeSeries<T> { 
    void add(Instant when, T data); 
} 

कक्षाओं हम एक को लागू से निपटने में से कुछ के लिए (Instant, T) जोड़े का एक नक्शा इंटरफ़ेस

interface TimeStamped { 
    Instant getTimeStamp(); 
} 

और मैं स्पष्ट रूप से समय बताते हुए बिना इस तरह के डेटा आइटम जोड़ने के लिए TimeSeries इंटरफ़ेस में एक और अधिक सुविधाजनक तरीका प्रदान करना चाहते हैं। असल में, मुझे

interface TimeSeries<T> { 
    void add(Instant when, T data); 
    default <X extends T & TimeStamped> void add(X data) { 
     add(data.getTimeStamp(), data); 
    } 
} 

but this seems not allowed by the language because I cannot use type variables in intersection types चाहिए। क्या कोई काम-आसपास है जिसमें स्थैतिक प्रकार-सुरक्षा को छोड़ना शामिल नहीं है? केवल बातें मैं के साथ आ सकते हैं

interface TimeSeries<T> { 
    void add(Instant when, T data); 
    default void add(TimeStamped data) { 
     add(data.getTimeStamp(), (T)data); 
    } 
    default void add(TimeStamped t, T data) { 
     add(t.getTimeStamp(), data); 
    } 
} 

add(TimeStamped t, T data) टाइप-सुरक्षित है लेकिन अभी भी असुविधाजनक है।

+4

एक सरल समाधान का एक 'इंटरफ़ेस TimeStampedTimeSeries होगा TimeSeries ' फैली <टी टाइमस्टैंप फैली> - आप इसे इस्तेमाल कर सकते हैं जब timeseries को आबाद करने और जब यह लेने तुम सिर्फ 'TimeSeries ' का उल्लेख कर सकते हैं। – assylias

+0

एक और कार्यवाही एक स्थिर विधि स्थिर <एक्स टाइमस्टैम्प> शून्य जोड़ (टाइमसरीज टाइमरीज़, एक्स एक्स) –

+0

@cppbeginner का उपयोग करना है कि कोई भी अतिरिक्त सादगी नहीं लाता है। – Vlasec

उत्तर

1

मुझे लगता है कि मैं आपका प्रश्न समझता हूं। असल में, आपके पास TimeSeries कुछ सरल प्रकार के साथ हो सकता है जो TimeStamped को लागू नहीं करता है, लेकिन इसके कुछ उप-वर्ग हैं। उन मामलों में, @assylias द्वारा कामकाज भी मदद नहीं करता है।

ठीक है, मुझे लगता है कि जावा 8 में इस समस्या के लिए कोई साफ समाधान नहीं है, और मुझे जावा 9 के साथ कोई अनुभव नहीं है, लेकिन मैंने अपनी नई सुविधाओं के बारे में पढ़ने के दौरान ऐसा कुछ भी नहीं देखा। इसका मतलब है कि आप या तो स्थिर प्रकार की सुरक्षा या आराम का त्याग करते हैं।

यह कहना मुश्किल है कि सबसे अच्छा कामकाज क्या है। मूल रूप से हम यहाँ अब तक है: ऐसे मामलों में जहां अपने आधार वस्तु पहले से ही TimeStamped इंटरफ़ेस लागू करता है, के रूप में @assylias ने सलाह दी के लिए

  • टाइमस्टैंप-केवल इंटरफ़ेस।
  • @cppbeginner द्वारा सलाह दी गई स्थिर विधि। मुझे सिंटैक्स पसंद नहीं है हालांकि, यह सिंटैक्स चीनी के रूप में है, लेकिन आप एक स्थिर कॉल के साथ समाप्त होते हैं। हालांकि यह काफी बहुमुखी है और आप जो चाहते हैं वह करता है।
  • सिंटैक्स चीनी विचार पूरी तरह से छोड़ दें और इसे दास की तरह टाइप करें।
  • टाइप अप सुरक्षा दें और एक अच्छा कोड है जो बैकफायर कर सकता है।
  • ओह प्रतीक्षा करें, एक और संभावना है। TimeSeries के साथ तर्क के रूप में इसे TimeStamped इंटरफ़ेस की विधि बनाएं। वास्तव में स्थैतिक जाने से बेहतर, लेकिन थोड़े नीचे।

मैं यह तय नहीं कर सकता कि आपके लिए कौन सा बेहतर है क्योंकि मुझे आपके उपयोग के मामले को नहीं पता है। उनमें से कोई भी सही नहीं है। मुझे पहले से ही इस मुद्दे का सामना करना पड़ा और मुझे कोई सुपर-स्मार्ट समाधान नहीं मिला। एक और चीज जो मैं करने में असमर्थ था वह एक सामान्य enum है। मेरा मतलब है, क्यों नहीं, यह दिलचस्प होगा अगर यह संभव था (लेकिन यह नहीं है, या तो)।

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