2017-01-22 7 views
6

कंपाइलर infix + जेनेरिक तरीकों को स्वीकार करते हैं, लेकिन इसका उपयोग करने के लिए वाक्यविन्यास क्या है? उदाहरण के लिए, उन 2 समान तरीकों को देखते हुए (सापेक्ष मनमाने ढंग से सामान्य प्रकार):क्या हम कोटलिन में इंफिक्स जेनेरिक तरीकों का उपयोग कर सकते हैं?

infix inline fun Int1.plus1(i: Int1) = Int1(this.value + i.value) 
infix inline fun <U> Int1.plus2(i: Int1) = Int1(this.value + i.value) 

मैं लिख सकते हैं:

Int1(3).plus1(Int1(4)) 
Int1(3) plus1 Int1(4) 
Int1(3).plus2<Int>(Int1(4)) 

लेकिन यह कॉल अमान्य है:

Int1(3) plus2<Int> Int1(4) 

मुझे किसी ने समझा सकता क्यूं कर ?

उत्तर

4

टी एल; डॉ हाँ, हम

सबसे पहले, इस तरह के विधि

infix fun <U> Int.foo(i: Int) = ... 

क्योंकि foo कभी नहीं प्रकार पैरामीटर का उपयोग parameterizing का कोई मतलब नहीं यू, दोनों फोन करने वाले और तर्क के प्रकार परिभाषित कर रहे हैं कर सकते हैं

जब आप किसी विधि को पैरामीटर करते हैं तो आप signature से सामान्य प्रकार के साथ

01 जैसे किसी प्रकार से कनेक्ट करते हैं
infix fun <U> U.foo (other: U) = ... 

या उनमें से कम से कम एक

infix fun <U> Int.foo (other: U) = ... 
infix fun <U> U.foo (other: Int) = ... 

संकलक लगता होगा तर्क और/या फोन करने वाले वस्तु प्रकार

अपने मामले संकलक में से यू के प्रकार लगता है कि नहीं कर सकते यू टाइप करें क्योंकि यह न तो कॉलर से जुड़ा हुआ है और न ही

+0

लेकिन कहता है कि आपके पास कक्षा 'Int2' है जो 'Int1' तक फैली हुई है। फिर आपके पास यह फ़ंक्शन है: 'इन्फिक्स इनलाइन मजेदार यू.प्रिंट (i: Int) = println ("$ {U :: class} $ i") '। यदि आप 'यू' 'इंट 1' होना चाहते हैं, तो आप इसे इस तरह कॉल कर सकते हैं:' Int2 (5)। प्रिंट (4) '। क्या इन्फिक्स नोटेशन का उपयोग करके यह कॉल करना संभव है? – marstran

+0

@marstran हां, आपको अपेक्षित प्रकार 'Int2 (5) प्रिंट 4.to (Int1 :: class)' –

+0

पर यह तर्क नहीं डालना है कि यह काम नहीं करता है। यह तर्क एक सामान्य 'Int' है। यह प्रकार 'यू' का रिसीवर है जो समस्या है। क्या मुझे इसके बजाय इसे कास्ट करना होगा? थोड़ा अजीब लगता है कि इंफिक्स कार्यों से निपटने के दौरान मुझे केवल एक कास्ट का उपयोग करना होगा। – marstran

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