मैं कुछ सामान्य कोड लिखने और समस्या का सामना करने की कोशिश कर रहा हूं। यहाँ कोड है

public abstract class AbstractService<D extends IDTO> {
    public String ex(D dto) {
        return null;
    }
}


public class AService extends AbstractService<TestA> {
    @Override
    public String ex(TestA dto) {
        return "a";
    }
}

public class BService extends AbstractService<TestB> {
    @Override
    public String ex(TestB dto) {
        return "b";
    }
}

class TestA impements IDTO {
}

class TestB impements IDTO {
}

तो जैसा कि आप देख सकते हैं, यह वास्तव में सरल कोड है, एक सार सेवा जिसमें बाउंडेड परम है जो आईडीटीओ को बढ़ाता है। सेवा AService और BService के दो कार्यान्वयन जो उनके संबंधित DTO का उपयोग करते हैं।

ऐसा कोई अन्य वर्ग नहीं है जिसे रनटाइम इंस्टेंस के आधार पर ex() विधि को कॉल करने की आवश्यकता हो। यहाँ मैं समस्या का सामना कर रहा हूँ।

public class TestAll {
    public void executeRequest(final IDTO dto){
        // serviceMap contains list of all Services here A and B
        serviceMap.get(type).ex(dto);
    }
}

लाइन निर्माण पर समस्या ()।

एब्सट्रैक्ट सर्विस प्रकार में विधि बिल्ड (कैप्चर # 5-ऑफ? आईडीटीओ बढ़ाता है) तर्कों (आईडीटीओ) के लिए लागू नहीं है

क्या कोई इस मुद्दे को ठीक करने में मदद कर सकता है?

2
Still Learning 21 मार्च 2020, 18:25
क्या आप लिख सकते हैं कि आपकी विधि build() का कार्यान्वयन कहां है?
 – 
oleg.cherednik
21 मार्च 2020, 18:28
अपना वास्तविक कोड रखने के लिए आपको कम से कम अपना प्रश्न संपादित करना होगा। त्रुटि संदेश build() के बारे में बात कर रहा है, आप अपना serviceMap या type नहीं दिखा रहे हैं। यदि आप "ऑब्जेक्ट के प्रकार के आधार पर स्वचालित रूप से सही सेवा चुनें" - पैटर्न के लिए जा रहे हैं, तो आप इसे जेनेरिक के साथ प्राप्त नहीं करेंगे।
 – 
Kayaman
21 मार्च 2020, 19:03

2 जवाब

मुझे इसका कारण मिला कि यह मुझे त्रुटि क्यों दे रहा था। यह मेरी गलती थी क्योंकि मैं वसंत की मदद से नक्शा बनाने की कोशिश कर रहा था और बाध्य दृष्टिकोण का उपयोग कर रहा था।

यह मेरा पिछला कोड था।

    @Autowired
    public void setServicesList(List<AbstractService<IDTO>> abstractServices) {
        serviceMap = abstractServices.stream().collect(Collectors.toMap(AbstractService::getType, Function.identity()));
    }

और मुझे बाध्य दृष्टिकोण को हटाना पड़ा और अब यह काम कर रहा है।

    public void setServicesList(List<AbstractService> abstractServices) {
        serviceMap = abstractServices.stream().collect(Collectors.toMap(AbstractService::getType, Function.identity()));
    }
1
HoRn 21 मार्च 2020, 22:24

यदि आप जानते हैं कि Map किस प्रकार की सेवा है, तो आप निम्न कार्य कर सकते हैं:

// define your service map
private final Map<String, AbstractService<? extends IDTO>> serviceMap = Map.of(
        "a", new AService(),
        "b", new BService());

// cast `AbstractServise` from the map into required type:
public void executeRequest(final TestA dto){
    ((AbstractService<TestA>)serviceMap.get("a")).ex(dto);
}

public void executeRequest(final TestB dto){
    ((AbstractService<TestB>)serviceMap.get("b")).ex(dto);
}
0
oleg.cherednik 21 मार्च 2020, 19:04
मैं क्या समझ सकता हूं, सार वर्ग कुछ भी कहता है जो आईडीटीओ को बढ़ाता है और कॉलर क्लास में यह आईडीटीओ प्रकार पास करता है? हालांकि यकीन नहीं है।
 – 
Still Learning
21 मार्च 2020, 18:46
एक उत्तर अपडेट करें।
 – 
oleg.cherednik
21 मार्च 2020, 19:04