Guava's ClassPath
का उपयोग करके मैं एक विशिष्ट पैकेज में स्थित कक्षाओं को प्रारंभ करने की कोशिश कर रहा हूं, लेकिन मैं कन्स्ट्रक्टर को प्रारंभ करने के लिए उपयोग करना चाहता हूं क्योंकि अपवादों का प्रचार नहीं करता है।साइक्लिक इंटरफ़ेस त्रुटि का उपयोग करते समय orElseThrow
ClassPath.from(classLoader).getTopLevelClasses("test.package").stream()
.map(ClassPath.ClassInfo::load)
.map(Class::getConstructors)
.map(Arrays::stream)
.map(constructorStream -> constructorStream
.filter(constructor -> constructor.getParameterCount() == 0)
.findAny()
.orElseThrow(RuntimeException::new)
);
बहरहाल, यह एक त्रुटि InteliJ में बस चक्रीय इंटरफ़ेस बताते हुए देता है: तो यह है कि मैं क्या बाहर काम किया कंस्ट्रक्टर्स प्राप्त करने के लिए है। मुझे लगता है कि मुझे पता है कि एक चक्रीय इंटरफेस क्या है, लेकिन मुझे यकीन नहीं है कि इससे यह त्रुटि क्यों होगी। जहां तक मुझे पता है कि रिटर्न टाइप के रूप में जाना जाता है (जो orElseThrow
के लिए इस मामले में Constructor<?>
के रूप में वापसी मूल्य है) तो एक अनचेक अपवाद फेंकना ठीक होना चाहिए। अगर मैं orElse(null)
का उपयोग करता हूं तो त्रुटि दूर हो जाती है। यहाँ क्या चल रहा है और मैं रनटाइम अपवाद कैसे फेंक सकता हूं जिसे मैं फेंकना चाहता हूं?
यदि आप विशिष्ट प्रकार के साथ 'orElseThrow' उपसर्ग करते हैं तो क्या होता है? '। orElseThrow (RuntimeException :: new)' –
RealSkeptic
त्रुटि हटा दी गई है और अब इरादे के अनुसार काम करता है। ऐसा क्यों? 'एक्स' पहले से ही उपलब्ध अपवाद द्वारा परिभाषित नहीं किया जाना चाहिए? – danthonywalker
मुझे लगता है कि आप एक कंपाइलर का उपयोग कर रहे हैं जो टाइप अनुमान को बहुत कसकर नहीं करता है। ग्रहण में, यह स्पष्ट प्रकार तर्क के बिना काम करता है। ओरेकल के 'जावैक' में यह एक अपरिवर्तित अपवाद के बारे में शिकायत करता है। – RealSkeptic