2017-04-05 16 views
8

मैं वस्तुओं को बनाने, पढ़ने, अपडेट करने और हटाने के लिए एक मूल वर्ग को लागू करने की कोशिश कर रहा हूं। मुझे यकीन है कि मुझे ऐसा करने के लिए एक लाइब्रेरी मिल सकती है लेकिन मैं शैक्षिक उद्देश्यों के लिए इसे स्वयं कर रहा हूं।जावा डुप्लिकेट जेनेरिक परिभाषा

तो मैं इसे बनाया है कि जो कुछ भी सहेज संस्थाओं हैं और वे एक विशेष प्रकार का एक पहचानकर्ता है:

interface Entity<T extends Serializable> extends Serializable 
{ 
    T getIdentifier(); 
} 

संस्थाओं के साथ-साथ serializable हैं और उनके पहचानकर्ता। फिर, मेरे पास EntityPersistor है जो इकाई को उनकी सामग्री (धारावाहिकरण का उपयोग करके) से बचाने और उन्हें अपनी कुंजी से नामित करने के लिए माना जाता है। अब के लिए इस persistor का मेरा एकमात्र कार्यान्वयन उन्हें डिस्क पर बचा रहा है। यह पहचानकर्ता को फ़ाइल के नाम के रूप में सहेजने के लिए उपयोग कर रहा है।

interface EntityPersistor<K extends Serializable, T extends Entity<K>> extends Iterable<T> 
{ 
    void save(T entity); 

    void delete(T entity); 

    void deleteById(K id); 

    T getById(K id); 

    boolean contains(K id); 

    List<T> loadAll(); 
} 

तो, समस्या मैं दो बार कुंजी के लिए प्रकार को फिर से परिभाषित करने के लिए है जब मैं इसका उपयोग करना चाहते है:

यहाँ मेरी इकाई persistor है। मैं लिखना चाहता हूं:

interface EntityPersistor<T extends Entity<K extends Serializable>> extends Iterable<T> 

लेकिन यह एक कंपाइलर त्रुटि उत्पन्न करता है। तो मुझे इसे इस तरह उपयोग करना होगा:

EntityPersistor<String, Product> persistor = new FileEntityPersistor<>(); 

जो असुविधाजनक है।

क्या कोई कामकाज या ऐसा करने का बेहतर तरीका है? मुझे लगता है कि यह मेरी घोषणा कम पठनीय कर देगा लेकिन उपयोग अधिक महत्वपूर्ण है।

संपादित करें:

मुझे लगता है कि class Product implements Entity<String>

+1

क्या यह सही लगता है कि 'उत्पाद'' इकाई 'है? – Zircon

+0

@ ज़िक्रोन हां, सवाल संपादित किया – Winter

उत्तर

2

आम तौर पर एक या दूसरे को दूर करने के लिए एक रास्ता होगा उल्लेख करना भूल गया, लेकिन समस्या यह है कि आप दोनों K और T का उपयोग कर रहे पैरामीटर प्रकार के रूप में है।

कंपाइलर को बताने का कोई तरीका नहीं है कि विधि का पैरामीटर ऑब्जेक्ट T (Entity) का "आंतरिक" जेनेरिक प्रकार होना चाहिए। प्रकार विलोपन के कारण Entity<K> (T)

: Entity (K)

और एक इकाई के लिए ही की "आंतरिक" सामान्य प्रकार की चर्चा करते हुए के लिए

एक: इसलिए, आप दो जेनरिक की जरूरत है , जावा आपके द्वारा घोषित किए बिना रनटाइम पर पैरामीटर प्रकार K को समझने में सक्षम नहीं होगा।

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