2010-12-12 7 views
5

मैं जेनिक्स का उपयोग करके कुछ कक्षाएं लिख रहा हूं लेकिन मुझे क्लास सॉल्यूशंससेट के लिए समाधान नहीं मिला है और इसलिए मुझे त्रुटि मिल रही है "टाइप पैरामीटर एस इसके बाध्य के भीतर नहीं है "। मैंने पिछले को एक ही त्रुटि के बारे में प्रश्न पढ़े हैं लेकिन मैं इसे अपने मामले के लिए हल नहीं कर सकता। क्या कोई मुझे जेनेरिक के बारे में अपना ज्ञान सुधारने में मदद कर सकता है? किसी भी एक अच्छी किताब के संदर्भ में (मैं Google में बहुत सारी जानकारी पर पा सकता हूं लेकिन अगर कोई पुस्तक, ट्यूटोरियल इत्यादि का स्वागत कर सकता है तो आपका स्वागत होगा)। हालांकि मैंने एक प्रश्न पूछने के नियमों को ध्यान में रखने की कोशिश की लेकिन मैं माफ़ी मांगता हूं कि मेरा प्रश्न इन नियमों को पूरा नहीं करता है।जावा जेनरिक का उपयोग कर त्रुटि के बारे में: "टाइप पैरामीटर एस इसके बाध्य के भीतर नहीं है"

 


public interface Subset<T extends Comparable<T>> extends Comparable<Subset<T>> 
public class MathSubset<T extends Comparable<T>> extends TreeSet<T> implements Subset<T> 

public interface Solution<T extends Comparable<T>> 

public interface Solutions<S extends Solution<?>> extends Iterable<S> 
public class SolutionsSubset<S extends Solution<?>> extends MathSubset<S> implements Solutions<S> 

 

मैं की जरूरत है कि सबसेट तुलनीय लागू होता है:

मैं निम्नलिखित वर्गों और इंटरफेस है। SolutionsSubset में, वर्ग MathSubset समाधान ऑब्जेक्ट्स संग्रहीत करता है। इसे काम करने के लिए मुझे इन परिभाषाओं को कैसे बदलना है?

अग्रिम

उत्तर

1

सबसे पहले धन्यवाद आप, यहाँ पूर्ण त्रुटि (एक उचित पैरामीटर नहीं मिल रहा है जो विशिष्ट है MathSubset करने के लिए) है: Bound mismatch: The type S is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type QifFixer.MathSubset<T>

समस्या यह है कि MathSubset एक <T extends Comparable<T> उम्मीद है, लेकिन आप इसे S extends Solution<?> दे रहा है - उन प्रकारों को एक दूसरे के साथ कुछ लेना देना नहीं है, क्योंकि समाधान Comparable<T> का उत्तराधिकारी या कार्यान्वित नहीं करता है।

कुछ भी, तो आप इस कोशिश कर सकते:

public class SolutionsSubset<S extends Comparable<S>> extends 
    MathSubset<S> implements Solutions<Solution<S>>; 

दुर्भाग्य से, यह अभी भी काम नहीं करेगा क्योंकि MathSubset लागू करता Iterable, लेकिन इतना समाधान करता है।

समाधानों के लिए इटरटेबल का विस्तार करने के लिए एक आसान फिक्स होगा, लेकिन यह वास्तव में मुझे लगता है जैसे आप की आवश्यकता से अधिक जटिल दृष्टिकोण का उपयोग करने की कोशिश कर रहे हैं। "है-ए" डिज़ाइन के बजाय "हैस-ए" यहां अधिक फायदेमंद हो सकता है?

+0

आपकी मदद के लिए धन्यवाद; आखिर में मैंने "हैस-ए" डिज़ाइन में बदलने का फैसला किया। वैसे भी, आपके समाधान ने मुझे बेहतर तरीके से समझने में मदद की जावा में जेनिक्स – user539694

1

जेनरिक कुछ ऐसा है जो जल्दी से हाथ से बाहर निकल सकता है, खासकर यदि आप एक बार में "सभी सामान्य" होने का प्रयास करते हैं। थोड़ा ही काफी है। हमेशा मेरी मदद करता है कंक्रीट (कार्यान्वयन सहित) शुरू करना और फिर धीरे-धीरे सामान्य पैरामीटर को एक पैरामीटर और कक्षा में एक समय में प्रतिस्थापित करना है।

क्या कोई मुझे जेनेरिक के बारे में अपना ज्ञान सुधारने में मदद कर सकता है?

http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

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

+0

बहुत बहुत धन्यवाद। यह जावा और जेनेरिक के बारे में एक बहुत अच्छा वेब है। – user539694

6

लिए, MathSubset में प्रकार तर्क के रूप में प्रयोग की जाने वाली SolutionsSubset रों S चाहिए extend Comparable<S>

import java.util.TreeSet; 

interface Subset<T extends Comparable<T>> 
    extends Comparable<Subset<T>> { } 

class MathSubset<T extends Comparable<T>> 
    extends TreeSet<T> 
    implements Subset<T> 
{ 
    public int compareTo(Subset<T> other) { throw new Error(); } 
} 

interface Solution<T extends Comparable<T>> { } 

interface Solutions<S extends Solution<?>> extends Iterable<S> { } 

class SolutionsSubset<S extends Solution<?> & Comparable<S>> 
    extends MathSubset<S> 
    implements Solutions<S> 
{ } 

कुछ टिप्पणियाँ:: एक compilable उदाहरण के रूप में यह बहुत ही सार उदाहरण है, और के बारे में सोचने के लिए इतना आसान नहीं है। कोड डालना ताकि आपको स्क्रॉल करने की आवश्यकता न हो, अच्छा है।यहां पर एक बहुत सारी विरासत चल रही है, शायद TreeSet को विस्तारित करने के बजाय कहें। पहचानकर्ताओं के बीच पहचान करना मुश्किल है Solutions और Solution

+0

धन्यवाद। आपका समाधान दिलचस्प था हालांकि मैं अंततः इसे सरल बनाने के लिए डिज़ाइन को बदलता हूं। – user539694

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