Jeśli używasz Scala (i na podstawie znacznika jestem zakładając, że jesteś), jedno rozwiązanie bardzo ogólne jest napisanie kodu biblioteki przeciwko klasie scala.math.Integral
typu:
def naturals[A](implicit f: Integral[A]) =
Stream.iterate(f.one)(f.plus(_, f.one))
można również używać granic kontekstowych i Integral.Implicits
dla ładniejszy składnią:
import scala.math.Integral.Implicits._
def squares[A: Integral] = naturals.map(n => n * n)
teraz można korzystać z tych metod z obu Int
lub Long
lub BigInt
co potrzebne, ponieważ wystąpień Integral
istnieją dla nich wszystkich:
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)
Nie ma potrzeby, aby zmienić kod biblioteki: wystarczy użyć Long
lub BigInt
gdzie przelewowy jest problemem i Int
inaczej.
Zostanie nałożona pewna kara pod względem wydajności, ale ogólna charakterystyka i możliwość odroczenia decyzji o wartości Int
-lub- BigInt
może być tego warta.
Cześć Rex, dziękuję za szybką odpowiedź! Rozsądne rozwiązanie, chociaż może wymagać ponownego fakturowania. Jak trudno jest powiedzieć, że manipuluje klasą podstawową Integer dodając flagę kontroli przepełnienia do standardowych funkcji "operatora", biorąc pod uwagę złożony system typów? – IODEV
Btw, w odniesieniu do ""? + "", Czy istnieje standardowa konwersja nazw na Scalę, której należy użyć?/Dzięki z góry – IODEV
@IODEV - Możesz dodać klasę wrapper, ale nie możesz sensownie manipulować klasą podstawową, ponieważ faktycznie mapuje ona do prymitywu 'int' w JVM i dlatego ma dużo specjalnej magii kompilatora. Wybór "?" Był przeze mnie arbitralny; zaczynając od '+', utrzymasz operatora na pierwszym miejscu i lubię symetrię (a inni robią wystarczająco dużo, aby chociaż nie nazwałbym tego "konwencją" jest przynajmniej znajomy), więc dodałem kolejne '+' na końcu . '+ @' działałoby równie dobrze. –