2017-06-09 14 views
5

मैं बहुत तरह जावा में एक विधि है:क्या कोटलिन में चौराहे कास्टिंग संभव है?

public <T extends A & B> methodName(T arg, ...) 

जहां एक एक वर्ग है और बी एक अंतरफलक है।

मेरी kotlin वर्ग में, मैं प्रकार सी का एक और variable है, और मैं निम्नलिखित को प्राप्त करना चाहते हैं:

if (variable is A && variable is B) { 
    methodName(variable, ...) 
} else { 
    // do something else 
} 

यह संभव ठीक से तो variable कास्ट करने के लिए है कि यह त्रुटियों के बिना एक तर्क के रूप में इस्तेमाल किया जा सकता है है ?

वर्तमान में, variable एक सेटर विधि है, तो स्मार्ट कास्टिंग उपलब्ध नहीं है। हालांकि, मैंने इसे स्थानीय val के साथ भी परीक्षण किया है और मान Any टाइप करने के लिए अनुमानित है जो मदद नहीं करता है।

+0

आपका कोटलिन संस्करण क्या है? –

+2

यहां एक संबंधित समस्या है: https://youtrack.jetbrains.com/issue/KT-7304 –

उत्तर

1

कोटलिन चौराहे के प्रकार का समर्थन नहीं करता है। यह variable को Any पर स्मार्ट कास्ट होने का कारण बनता है, क्योंकि यह A और B का सामान्य पूर्वज है।

हालांकि, कोटलिन जेनेरिक प्रकार की बाधाओं का समर्थन करता है। आप इसे एक या अधिक प्रकार के प्रकार पैरामीटर को बाधित करने के लिए उपयोग कर सकते हैं। इसका उपयोग दोनों विधियों और वर्गों पर किया जा सकता है।

fun <T> methodName(arg: T) 
    where T : A, 
      T : B { 
    .... 
} 

आप इस का उपयोग कर सकते हैं एक वर्ग है जो दोनों A और B, और उसके बाद प्रतिनिधियों इन के कार्यान्वयन फैली बनाकर अपनी समस्या को हल पाने के लिए: इस कार्य के लिए वाक्य रचना (Kotlin में अपने methodName के समकक्ष) है आपके ऑब्जेक्ट के प्रकार। इस तरह:

class AandB<T>(val t: T) : A by t, B by t 
    where T : A, 
      T : B 

अब आप methodName अपने अगर परीक्षण बदलकर जाँच करने के लिए कॉल कर सकते हैं अगर यह एक AandB<*> है:

if (variable is AandB<*>) { 
    methodName(variable, ...) 
} 

आप हालांकि एक AandB कहीं variable रैप करने के लिए की आवश्यकता है। मुझे नहीं लगता कि अगर आप variable के लिए कहीं भी उपलब्ध जानकारी नहीं रखते हैं तो आप ऐसा कर सकते हैं।

नोट: AandB वर्ग hashCode, equals या toString को लागू नहीं करता है। आप उन्हें t के कार्यान्वयन के लिए प्रतिनिधि के रूप में लागू कर सकते हैं।

नोट 2: यह केवल तभी काम करता है जब A और B इंटरफेस हैं। आप एक वर्ग में प्रतिनिधि नहीं दे सकते।

+0

जैसा कि आपने उल्लेख किया है और जैसा कि मैंने परीक्षण किया है, ए और बी दोनों इंटरफेस होना चाहिए। हालांकि, मेरे फ़ंक्शन का तर्क टाइप टी का है जहां टी: [वर्ग], टी: [इंटरफ़ेस]। क्या उसके आस-पास कोई रास्ता है? फिर भी आपकी विधि बहुत दिलचस्प है। –

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