public <S extends T> List<S> save(Iterable<S> entities) {
//...
}
मैं निम्नलिखित का उपयोग करते हैं विधिजावा: इस सामान्य विधि को ओवरराइड कैसे करें?
@Override
public List<MyType> save(Iterable<MyType> structures) {
List<MyType> result = new ArrayList<>();
//...
return result;
}
ओवरराइड करने के लिए मैं त्रुटि निम्न हो:
method does not override or implement a method from a supertype
name clash: save(Iterable<MyType>) in MyTypeRepositoryImpl and <S>save(Iterable<S>) in SimpleJpaRepository have the same erasure, yet neither overrides the other
where S,T are type-variables:
S extends T declared in method <S>save(Iterable<S>)
T extends Object declared in class SimpleJpaRepository
मैं यह कैसे हल कर सकते हैं? मुझे सामान्य होने की विधि की आवश्यकता नहीं है और वास्तव में यह नहीं होना चाहिए। क्या मेरा मतलब है कि
@Override
public <S extends MyType> List<S> save(Iterable<S> structures) {
List<S> result = new ArrayList<>();
//...
return result;
}
विधि MyType की एक नई वस्तु जो सूची में 'उपयुक्त' नहीं है बना सकते हैं के रूप में काम नहीं करेगा।
मैं यह काम कैसे कर सकता हूं?
संपादित करें:
स्पष्टीकरण के लिए। मैं (जो QuerydslJpaRepository द्वारा extented है) वसंत डेटा SimpleJpaRepository के विभिन्न बचाने() पद्धतियों
कक्षा defintions ओवरराइड करने के लिए कोशिश कर रहा हूँ:
public class MyTypeRepositoryImpl
extends QueryDslJpaRepository<MyType, Long>
implements MyTypeRepository
@NoRepositoryBean
public interface MyTypeRepository
extends JpaRepository<MyType, Long>,
QueryDslPredicateExecutor<MyType>
और यह (स्प्रिंग डाटा से)
public class QueryDslJpaRepository<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements QueryDslPredicateExecutor<T>
संपादित करें 2:
विधि प्रत्येक तत्व के लिए सहेजती है (MyType इकाई) और उस विधि में निम्नलिखित तर्क शामिल हैं:
- इकाई एक क्षेत्र है जो अद्वितीय है
- प्राप्त है कि मान फ़ील्ड और देखें कि क्या है कि मूल्य के साथ इकाई पहले से मौजूद
- यदि हाँ है, का उपयोग करें कि इकाई (entityManager.merge करने के लिए कॉल) -> रिटर्न काम नहीं करता है MyType S
- यदि कोई नया कोई नहीं बनाता -> यहां नई ऑब्जेक्ट बनाई गई है। जेनेरिक प्रकार
के लिए काम नहीं करता है 4. मैं बस id = null सेट कर सकता हूं और पास ऑब्जेक्ट का उपयोग कर सकता हूं। यह 3.
के लिए काम नहीं करता है इसलिए मुझे बहुत परेशान है कि इस विधि में यह हस्ताक्षर क्यों है। यह मेरे लिए यह अनुपयोगी बनाता है और मुझे नहीं पता कि मैं टी डीएओ का उपयोग कर टी के उप-वर्ग को क्यों बचाऊंगा। बचत विधियां केवल एक ही हैं। अन्य सभी बस टी का उपयोग करते हैं। मैं इसे संकलित करने के लिए बस एस पर डाल सकता हूं लेकिन यह बदसूरत लगता है ... क्योंकि टी से किसी अन्य प्रकार के अपवाद का कारण बनता है।
युक्त कक्षाएं कैसे घोषित की जाती हैं? – assylias
सूची के लिए "संगत" नहीं होने का क्या मतलब है? यह मूल '
' पैरामीटर की तरह दिखता है कि वर्ग को –सबक्लासिंग के साथ चारों ओर मकड़ने के बिना 'इंटरफेसनाम लागू' जैसे कुछ करने के द्वारा उपयोग किया जा सकता है, टिप्पणियों से अन्य उत्तरों और तथ्य यह है कि आप हैं जिस वर्ग पर आपका कोई नियंत्रण नहीं है, मेरा मानना है कि आपको 'सार्वजनिक <एस का उपयोग करने के लिए मजबूर किया जाता है MyType> सूची
सहेजें (Iterableसंरचनाएं) '। ऐसा इसलिए है क्योंकि ओवरराइड विधि जेनेरिक है और इसलिए ओवरराइडिंग विधि भी होनी चाहिए। –