यह कुछ हद तक अनावश्यक प्रतीत होता है, लेकिन A -> C
रूपांतरण वही है जो आपको आपूर्ति करना चाहिए। इसका कारण यह है कि अगर प्रत्यारोपण दुर्लभ होते हैं, तो ट्रांजिटिव चेन भी दुर्लभ होते हैं, और शायद आप जो चाहते हैं। लेकिन अगर implicits आम हैं, तो संभावना है कि आप कुछ भी किसी भी चीज़ में बदलने में सक्षम होंगे (या, यदि आप एक आसान दिखने वाले अंतर्निहित जोड़ते हैं, तो अचानक सभी तरह के व्यवहार बदल जाएंगे क्योंकि आपने निहित रूपांतरण के लिए अलग-अलग मार्ग खोल दिए हैं)।
आप स्कैला चेन को आपके लिए निहित रूपांतरण कर सकते हैं, हालांकि, यदि आप निर्दिष्ट करते हैं कि यह किया जाना है। कुंजी <%
के साथ जेनेरिक का उपयोग करना है जिसका अर्थ है "इसमें परिवर्तित किया जा सकता है"। यहां एक उदाहरण दिया गया है:
class Foo(i: Int) { def foo = i }
class Bar(s: String) { def bar = s }
class Okay(b: Boolean) { def okay = b }
implicit def to_bar_through_foo[T <% Foo](t: T) = new Bar((t: Foo).foo.toString)
implicit def to_okay_through_bar[U <% Bar](u: U) = new Okay((u: Bar).bar.length < 4)
scala> (new Foo(5)).okay
res0: Boolean = true
स्रोत
2012-03-04 19:10:22
संकेत: यह _associativity_ की तुलना में _transitivity_ जैसा दिखता है। और आप स्काला के निहितार्थों के लिए यह चाहते हैं कि पहले व्यक्ति नहीं हैं। इसके अलावा 'ए -> सी' शायद आपकी दूसरी पंक्ति में 'बी -> सी' के लिए एक टाइपो है? –
धन्यवाद। मैं जल्दी में था। –
पर भी एक नज़र डालें: [कैसे-कर-i-chain-implicits-in-scala] (http://stackoverflow.com/questions/5332801/how-can-i-chain-implicits-in-scala) –