2017-01-31 6 views
8

स्प्रिंग डेटा प्रोजेक्ट में क्रूड रिपोजिटरी प्रबंधित किए जा रहे इकाई वर्ग के लिए परिष्कृत सीआरयूडी कार्यक्षमता प्रदान करता है।इसका मतलब क्या है <S extends T> सहेजें (एस इकाई); वसंत रिपोजिटरी में?

public interface CrudRepository<T, ID extends Serializable> 
extends Repository<T, ID> { 

    <S extends T> S save(S entity); 

    T findOne(ID primaryKey); 

    Iterable<T> findAll(); 

    Long count(); 

    void delete(T entity); 

    boolean exists(ID primaryKey); 

    // … more functionality omitted. 
} 

सामान्य तौर पर, मुझे पता है कि "एस फैली टी" का अर्थ है, यानी कि एस, आपरेशन बचाने की वापसी प्रकार, टी के उप प्रकार क्यों यह बाधा के रूप में इस तरह के जोड़ने के लिए आवश्यक है होना चाहिए? मुझे लगता है कि इस तरह से ठीक कर कुछ होगा:

T save (T entity); 

void delete(T entity); 

में जैसा कि मैंने अधिक सहायता प्राप्त करने googled है और मैं निम्नलिखित stackoverflow पर ही सवाल समझ गए होंगे लेकिन यह नहीं ' टी मेरे लिए वास्तव में स्पष्ट:

Spring CrudRepository: why to invent a new generic type S

धन्यवाद।

+2

मुझे लगता है कि आप सही हैं। 'एस' अनावश्यक है, और हस्ताक्षर डिजाइन एक गलती है। – ZhongYu

उत्तर

8

आप के रूप में

T save (T entity); 

यह है करने के लिए थे, तो फिर केवल चर आप परिणाम आवंटित प्रकार T का होना चाहिए था सकता है।

इसलिए, यदि आप एक CrudRepository<Animal,AnimalID> repository है, और आप

Dog dog = getDog(); 
Dog savedDog = repository.save(dog); 

आप एक संकलन त्रुटि मिलती चाहते हैं - आप, Dog लिए परिणाम असाइन नहीं कर सकते, क्योंकि यह प्रकार T का हो गया है, में इस मामले में, Animal

आपको यह जांचना होगा कि लौटा हुआ मूल्य वास्तव में Dog प्रकार का था या नहीं, और यदि ऐसा है, तो इसे में रखने के लिए इसे Dog पर डालें।

घोषणा के साथ, इसका मतलब है कि आप इसे मूल तर्क के रूप में उसी प्रकार के चर के रूप में असाइन कर सकते हैं, क्योंकि प्रकार संकल्प इसकी अनुमति देगा।

घोषणापत्र स्वयं निर्दिष्ट नहीं करता है कि कुत्ते के गैर-पशु भागों को कैसे बचाया जाता है। यह सब परिणाम Dog पर परिणाम को असाइन करने की अनुमति देता है यदि यह मूल रूप से Dog था।

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