इन्हें सामान्यीकृत प्रकार की कमी कहा जाता है । वे आपको एक प्रकार के पैरामीटर वाले वर्ग या विशेषता के भीतर से इसके एक प्रकार के मापदंडों को आगे बढ़ाने के लिए अनुमति देते हैं । यहाँ एक उदाहरण है:
case class Foo[A](a:A) { // 'A' can be substituted with any type
// getStringLength can only be used if this is a Foo[String]
def getStringLength(implicit evidence: A =:= String) = a.length
}
निहित तर्क evidence
संकलक द्वारा आपूर्ति की जाती है, iff A
है String
। आप एक के रूप में यह सोच सकते हैं सबूत है कि A
है String
--The तर्क ही महत्वपूर्ण नहीं है, केवल जानते हुए भी कि यह मौजूद है। [संपादित करें: ठीक है, तकनीकी रूप से यह वास्तव में महत्वपूर्ण है क्योंकि यह एक अंतर्निहित रूपांतरण का प्रतिनिधित्व करता A
है String
, जो कि आपको कॉल करने की अनुमति देता है a.length
और आप पर संकलक चिल्लाना नहीं है]
अब मैं इसका उपयोग इस तरह कर सकता हूं:
scala> Foo("blah").getStringLength
res6: Int = 4
लेकिन मैं एक साथ उपयोग करने की कोशिश की है, तो Foo
कुछ युक्त एक अन्य की तुलना में String
:
scala> Foo(123).getStringLength
<console>:9: error: could not find implicit value for parameter evidence: =:=[Int,String]
आप उस त्रुटि को पढ़ सकते हैं जैसे "साक्ष्य नहीं पा सके कि Int == स्ट्रिंग" ... यही होना चाहिए! सामान्य आवश्यकता से अधिक के प्रकार पर और प्रतिबंधgetStringLength
लगा रहा है ; अर्थात्, आप केवल एक पर आह्वान कर सकते हैं । यह बाधा संकलन-समय पर लागू की जाती है, जो शांत है!A
Foo
getStringLength
Foo[String]
<:<
और <%<
इसी तरह काम करते हैं, लेकिन मामूली बदलाव के साथ:
A =:= B
मतलब A बिल्कुल B होना चाहिए
A <:< B
ए का मतलब बी का एक उपप्रकार होना चाहिए ( सरल प्रकार की बाधा के अनुरूप <:
)
A <%< B
इसका मतलब है कि ए को बी के रूप में देखा जा सकता है , संभवतः अंतर्निहित रूपांतरण के माध्यम से (सरल प्रकार की बाधा के अनुरूप <%
)
@Retronym द्वारा यह स्निपेट इस बात का एक अच्छा विवरण है कि इस तरह की चीज़ों को कैसे पूरा किया जाता था और कैसे सामान्यीकृत प्रकार की बाधाएं अब इसे आसान बनाती हैं।
परिशिष्ट
आपके अनुवर्ती प्रश्न का उत्तर देने के लिए, माना जाता है कि मैंने जो उदाहरण दिया है वह बहुत ही महत्वपूर्ण है और स्पष्ट रूप से उपयोगी नहीं है। लेकिन एक List.sumInts
विधि की तरह कुछ परिभाषित करने के लिए इसका उपयोग करने की कल्पना करें , जो पूर्णांक की एक सूची को जोड़ता है। आप इस विधि को किसी भी पुराने List
, केवल एक पर लागू करने की अनुमति नहीं देना चाहते हैं List[Int]
। हालाँकि, List
टाइप कंस्ट्रक्टर इतना संकुचित नहीं हो सकता है; आप अभी भी स्ट्रिंग्स, फॉक्स, बार, और व्हाट्सन की सूची में सक्षम होना चाहते हैं। तो एक सामान्यीकृत प्रकार की बाधा पर रखकर sumInts
, आप यह सुनिश्चित कर सकते हैं कि बस उस विधि में एक अतिरिक्त बाधा है कि इसका उपयोग केवल ए के लिए किया जा सकता है List[Int]
। अनिवार्य रूप से आप कुछ विशेष प्रकार की सूचियों के लिए विशेष-केस कोड लिख रहे हैं।