मैं Exception
के भीतर सामान्य वस्तुओं का संग्रह संग्रहीत करने की कोशिश कर रहा हूं और जेनिक्स को समझने में परेशानी हो रही है। विशेष रूप से, मैं हाइबरनेट वैलिडेटर का उपयोग कर रहा हूं और एप्लिकेशन की दूसरी परत में प्रसंस्करण के लिए अपवाद के भीतर उल्लंघन की एकत्रित सूची को सहेजना चाहता हूं। यहाँ एक उदाहरण है:अपवाद के तर्कों में जेनिक्स का उपयोग
Set<ConstraintViolation<User>> violations = validator.validate(user);
if (violations.size() > 0) {
throw new ValidationException("User details are invalid", violations);
}
ग्रहण में, throws
लाइन निर्माता अपरिभाषित दिखाई दे रहा है और सुझाव है मैं ValidationException(String, Set<ConstraintViolation<User>>
के निर्माता हस्ताक्षर बदल जाते हैं। यहाँ ValidationException है:
public class ValidationException extends Exception {
private Set<ConstraintViolation<?>> violations;
public ValidationException() {
}
public ValidationException(String msg) {
super(msg);
}
public ValidationException(String msg, Throwable cause) {
super(msg, cause);
}
public ValidationException(String msg, Set<ConstraintViolation<?>> violations) {
super(msg);
this.violations = violations;
}
public Set<ConstraintViolation<?>> getViolations() {
return violations;
}
}
हालांकि, मैं ValidationException
सामान्य रखने के लिए इतना है कि मैं सिर्फ User
सत्यापन से अधिक के लिए उपयोग कर सकते हैं चाहता हूँ। मैंने Set<ConstraintViolation<? extends Object>>
भी कोशिश की है, लेकिन एक ही परिणाम प्राप्त करें।
क्या मैं ऐसा करने का प्रयास कर रहा हूं?
public class ValidationException extends Exception {
private Set<ConstraintViolation<?>> violations;
@SuppressWarning("unchecked")
public <T> ValidationException(String msg, Set<ConstraintViolation<T>> violations) {
super(msg);
this.violations = (Set<ConstraintViolation<?>>)(Set<?>) violations;
}
}
जहां तक मैं समझता हूँ, अनियंत्रित डाली, इस मामले में पूरी तरह से सुरक्षित है ताकि @SuppressWarning("unchecked")
बिल्कुल कानूनी है:
तुम क्यों ConstrainsViolation की क्या ज़रूरत है पहली जगह में आम हो सकते? क्या आप प्रत्येक संभावित उल्लंघन के लिए एक सारणीबेस विरासत में एक अलग वर्ग नहीं बना सकते हैं? – Falcon
मैंने सोचा कि एक सामान्य अपवाद प्रकार का उपयोग करना एक अच्छा विचार होगा, लेकिन जैसा कि @axtavt उल्लेख किया गया है, अपवाद सामान्य नहीं हो सकते हैं। यह FAQ देखें: http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ301 – Tauren
@ फाल्कन: 'प्रतिबंधों का उल्लंघन' हाइबरनेट सत्यापन पैकेज का हिस्सा है और जेनेरिक का उपयोग करता है। यह मेरी खुद की एक वर्ग नहीं है। – Tauren