2012-03-07 9 views
14

में पैरामीटर के लिए एकाधिक प्रकार स्वीकार करते हैं मेरे पास एक विधि अद्यतन() दोनों के साथ दो ऑब्जेक्ट्स, ऑब्जेक्टए और ऑब्जेक्टबी हैं। मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो ऑब्जेक्टए या ऑब्जेक्टबी (लेकिन कोई अन्य प्रकार) स्वीकार नहीं करता है। वैचारिक रूप से, यह मैं क्या करने की कोशिश कर रहा हूँ:स्कैला

def doSomething[T <: ObjectA | T <: ObjectB](obj: T) = { 
    obj.update 
} 

मुझे पता है इस समस्या (जैसे, विधि अद्यतन() की संरचनात्मक टाइपिंग, आम आधार वर्ग, आदि) को हल करने के अन्य तरीके हैं, लेकिन मेरा सवाल यह है कि स्कैला में ऐसा करना संभव है और यदि ऐसा है तो वाक्यविन्यास क्या है? और इसे क्या कहा जाता है?

+0

कैसे आप इस काम करने की उम्मीद करेंगे? कंपाइलर को कैसे पता चलेगा कि टी टी के पास क्या तरीके नहीं थे अगर यह नहीं पता था कि यह किस प्रकार का था? यदि आप यह सुनिश्चित करना चाहते हैं कि आपकी कक्षा में 'अपडेट' है, तो यही संरचनात्मक प्रकार हैं। – dhg

+4

संभावित डुप्लिकेट [क्या स्कैला के पास "प्रकार का संयोजन" (यूनियन प्रकार) है?] (Http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types)। स्वीकार किए गए उत्तर और अगले सबसे अधिक रैंकिंग वाले मेरे अनबॉक्स किए गए यूनियन एन्कोडिंग को सीधे इस प्रश्न को हल करें। –

+0

@dhg, यदि ऑब्जेक्टए और ऑब्जेक्टबी दोनों में एक विधि अद्यतन() है और टाइप टी उन वर्गों में से एक या अन्य को विस्तारित करता है, तो यह पता चल सकता है कि प्रकार टी में एक अद्यतन() विधि है। –

उत्तर

15

स्कैला में, एक विवाद संघ बनाने के लिए या तो प्रकार है। मूल रूप से, आप की तरह कुछ करना होगा:

def doSomething(obj: Either[ObjectA, ObjectB]) { 
    obj.fold(fa, fb) 
} 

चेकआउट http://www.scala-lang.org/api/current/scala/Either.html

+1

यदि आप उन्हें एक के रूप में देखना चाहते हैं, तो आप एक संरचनात्मक प्रकार का उपयोग कर सकते हैं: 'obj.fold [{def update: unit}] (पहचान, पहचान) .update' –

+1

मुझे नहीं पता कि एफए या एफबी कहाँ से आया था आपका उदाहरण या आप obj पर fold() क्यों कॉल कर रहे हैं, लेकिन ऐसा करने के लिए या तो निकटतम, सबसे साफ तरीका प्रतीत होता है। धन्यवाद। –

+0

@ बिगविल्स यह आपकी समस्या के संदर्भ को जानने के लिए घुसपैठ कर रहा है क्योंकि मैं गलत हो सकता हूं लेकिन यह वास्तव में एक ही कार्य को संघ के दो संभावित वस्तुओं पर लागू करने के लिए संवेदना नहीं देता है। असल में, एफए और एफबी बंद होते हैं जो आप ऑब्जेक्ट ए या ऑब्जेक्टबी पर लागू होते हैं। मैंने उन्हें अपने उदाहरण में परिभाषित नहीं किया। आपको यूनियनों के बारे में अपने प्रश्न पर माइल्स सबिन टिप्पणी की जांच करनी चाहिए, हालांकि यह बहुत तकनीकी प्रकार हैकिंग है। – blouerat