आप स्काला उपयोग कर रहे हैं (और टैग मैं आप कर रहे हैं यह सोचते कर रहा हूँ के आधार पर), एक बहुत सामान्य समाधान scala.math.Integral
प्रकार वर्ग के खिलाफ अपने पुस्तकालय कोड लिखना है अच्छे वाक्य रचना के लिए संदर्भ सीमा और Integral.Implicits
का उपयोग करें:
import scala.math.Integral.Implicits._
def squares[A: Integral] = naturals.map(n => n * n)
अब आप या तो Int
या Long
या BigInt
की जरूरत के रूप में के साथ इन तरीकों का उपयोग कर सकतेके उदाहरण के बाद सेउन सभी के लिए मौजूद हैं:
scala> squares[Int].take(10).toList
res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
scala> squares[Long].take(10).toList
res0: List[Long] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
scala> squares[BigInt].take(10).toList
res1: List[BigInt] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
कोई ज़रूरत नहीं पुस्तकालय कोड बदलने के लिए: बस का उपयोग Long
या BigInt
ओवरफ़्लो चिंता और Int
अन्यथा है।
आप प्रदर्शन के मामले में कुछ जुर्माना अदा करेंगे, लेकिन सामान्यता और Int
-or- BigInt
को स्थगित करने की क्षमता इसके लायक हो सकती है।
हाय रेक्स, तत्काल उत्तर के लिए धन्यवाद! एक उचित समाधान हालांकि इसे कुछ पुन: फैक्टरिंग की आवश्यकता हो सकती है। जटिल प्रकार प्रणाली पर विचार करने वाले मानक "ऑपरेटर" कार्यों में ओवर-फ्लो चेक फ्लैग जोड़ने वाले इंटीजर बेस क्लास के साथ छेड़छाड़ करना कितना कठिन होगा? – IODEV
बीटीडब्ल्यू, "+? +" "के संबंध में, क्या मानक स्केल नामकरण रूपांतरण का उपयोग करना चाहिए?/अग्रिम धन्यवाद – IODEV
@IODEV - आप एक रैपर वर्ग जोड़ सकते हैं, लेकिन आप बेस क्लास के साथ समझदारी से छेड़छाड़ नहीं कर सकते क्योंकि यह वास्तव में जेवीएम में 'int' आदिम को मानचित्र करता है और इसलिए इसमें बहुत से विशेष कंपाइलर जादू हैं। '?' की पसंद मेरे द्वारा arbitary था; '+' से शुरू होने से ऑपरेटर की प्राथमिकता समान रहेगी, और मुझे समरूपता पसंद है (और अन्य पर्याप्त करते हैं ताकि जब मैं इसे _convention_ नहीं कहूंगा तो यह कम से कम परिचित है), इसलिए मैंने अंत में एक और '+' जोड़ा । '+ @ 'भी काम करेगा। –