2014-09-03 11 views
9

मान लीजिए मैं एक सामान्य वर्ग है कि मैं का उपयोग करें जो इस तरह की घोषणा की है:जावा सामान्य वस्तु

public class ConfigurableRuleKey<R extends Configurable & Rule> extends Key<R> { 

    private final R rule 

    public ConfigurableRuleKey(R rule) { 
     this.rule = rule; 
    } 

    /* Additional methods are declared here */ 

} 

और मैं एक कारखाने विधि है कि जांच में सफल हो नियम इंटरफ़ेस Configurable लागू करता है, तो लागू करने के लिए, जब बनाने चाहते हैं विन्यास नियम या सिर्फ एक बुनियादी कुंजी बनाने:

public static <R extends Rule> Key<R> create(R rule) { 
    if (rule instanceof Configurable) { 
     return new ConfigurableRuleKey<>(rule); //This will not compile 
    } else { 
     return new RuleKey<>(rule); 
    } 
} 

समस्या यह है कि मेरी कारखाने विधि में मैं ConfigurableRuleKey के निर्माता के लिए नियम पारित नहीं हो सकता है क्योंकि यह घोषित सामान्य बाधाओं फिट नहीं करता है (घटना अगर मैं होता है exp लाइसेंसपूर्वक जांच की गई है कि यह Configurable लागू करता है)। सवाल यह है कि मैं अपना नियम उदाहरण कैसे डाल सकता हूं ताकि यह ConfigurableRuleKey में कन्स्ट्रक्टर प्रतिबंधों को फिट कर सके?

उत्तर

3

मैं क्या आप कच्चे प्रकार का उपयोग किए बिना पूछना करने के लिए एक रास्ता खोजने किया था, लेकिन यह अभी भी अनियंत्रित डाले की एक जोड़ी शामिल है:

@SuppressWarnings("unchecked") 
public static <R extends Rule, T extends Rule & Configurable> Key<R> create(R rule) { 
    if (rule instanceof Configurable) { 
     return (Key<R>)new ConfigurableRuleKey<>((T)rule); 
    } else { 
     return new RuleKey<>(rule); 
    } 
} 

मुझे यकीन है कि अगर यह sp00m के जवाब से बेहतर है नहीं कर रहा हूँ, लेकिन यह कम से कम अलग है। :)

जावा के जेनेरिक के भीतर इसका सही ढंग से निर्माण नहीं किया जा सकता आंतरिक कारण यह प्रतीत होता है कि चौंकाने वाले प्रकारों को कंक्रीट इंटरफेस से बनाया जाना चाहिए, और अन्य प्रकार के चर से नहीं बनाया जा सकता है। इसलिए, इस उदाहरण में T बनाने का कोई तरीका नहीं है इस तरह से यह R से घिरा हुआ है। उस क्षमता के बिना, इस व्यवहार को अमूर्त करने के लिए Class.asSubclass जैसे जादू विधि का कोई तरीका नहीं है।

संपादित करें: इसी प्रकार, ऐसा प्रतीत होता है कि जावा 8 ने अज्ञात अंतरंग प्रकारों को प्रस्तुत किया जहां आप कई इंटरफेस पर जा सकते हैं - उदाहरण के लिए। (Configurable & Rule)rule - लेकिन यहां तक ​​कि इससे भी मदद नहीं मिलती है, उपर्युक्त कारण के लिए, आप (Configurable & R) पर नहीं जा सकते हैं। यह प्रकार चर T से छुटकारा पाने में मदद करेगा, हालांकि:

@SuppressWarnings("unchecked") 
public static <R extends Rule> Key<R> create(R rule) { 
    if (rule instanceof Configurable) { 
     return (Key<R>)new ConfigurableRuleKey<>((Configurable & Rule)rule); 
    } else { 
     return new RuleKey<>(rule); 
    } 
} 
+0

मेरा आईडीई मुझे बताता है कि यह कोड संकलित भी नहीं होगा लेकिन वास्तव में ऐसा लगता है कि यह करता है। :) धन्यवाद। मुझे लगता है कि मैं अपने आईडीई की सहायता टीम को इस मुद्दे की रिपोर्ट करूंगा। – SimY4

+0

@ सिम 4: जिज्ञासा से बाहर, आईडीईई के बारे में शिकायत क्या है? – Dolda2000

+0

मैं इंटेलिजे आइडिया 14 प्रारंभिक एक्सेस पूर्वावलोकन का उपयोग कर रहा हूं – SimY4

2

यह आपकी आवश्यकताओं के अनुरूप होना चाहिए:

@SuppressWarnings({ "rawtypes", "unchecked" }) 
public static <R extends Rule> Key<R> create(R rule) { 
    if (rule instanceof Configurable) { 
     return new ConfigurableRuleKey((Configurable) rule); 
    } else { 
     return new RuleKey<>(rule); 
    } 
} 

आप मैन्युअल रूप से जाँच की है कि ruleConfigurable है, इसलिए डाली सुरक्षित है।

+0

आप कच्चे प्रकार के प्रयोग कर रहे हैं और सभी चेतावनियों को दबाने, मुझे लगता है कि नहीं क्या ओ पी चाहता है। – WilQu

+0

@WilQu: मुझे संदेह है कि ओपी जेनरिक्स को तोड़ने के बिना क्या करना चाहता है, क्योंकि वास्तव में 'कॉन्फ़िगर करने योग्य रूलेकी' को तुरंत चालू करने के लिए, एक ठोस प्रकार जो 'कॉन्फ़िगर करने योग्य' और 'नियम' दोनों है, और 'create' फ़ंक्शन में ऐसे किसी ठोस प्रकार तक पहुंच नहीं है। – Dolda2000

+0

@WilQu मैं सभी चेतावनियों को दबा नहीं रहा हूं, केवल 'कच्ची प्रकार' ताकि संकलक जेनेरिकों की जांच न कर सके (मुझे यकीन नहीं है कि यह अन्यथा किया जा सकता है), और 'अनचेक' क्योंकि कंपाइलर नहीं कर सकता पता है कि कास्ट सुरक्षित है (जबकि यह निश्चित रूप से है, मैन्युअल रूप से 'exampleof' के लिए धन्यवाद चेक किया गया है)। – sp00m

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