约束 Scala 泛型中的类型以接受任何类型的 Int
Constraining types in Scala's generics to accept any kind of Int
我想写一个函数,大概是这样的:
def doubleit[A](a: A): A = {a + a}
但我希望 'A' 表示任何类型的 Int,但不是任何东西。有没有办法让 Scala 知道我想要 'A' 的意思?
def doubleit[A <: Int](a: A): A = {a + a}
被编译器拒绝。
在普通的 Scala 中你可以使用类型 class Integral
:
scala> def doubleit[A : Integral](a: A): A = implicitly[Integral[A]].plus(a, a)
doubleit: [A](a: A)(implicit evidence: Integral[A])A
scala> doubleit(2)
res0: Int = 4
scala> doubleit(BigInt(4))
res1: scala.math.BigInt = 8
另一种可能的语法:
def doubleit[A](a: A)(implicit ev: Integral[A]): A = ev.plus(a, a)
ev
是那些隐式参数的常用名称。
也可以使用+
、-
等普通操作代替plus
和minus
:
def doubleit[A](a: A)(implicit ev: Integral[A]): A = {
import ev._
a + a
}
或者按照@KChaloux 的建议,预先从 Integral.Implicits
导入:
import Integral.Implicits._
def doubleit[A : Integral](a: A): A = a + a
如果您希望函数不仅支持整数,还支持 Double
s、BigDecimal
s 等,您可以使用 Numeric
而不是 Integral
:
import Numeric.Implcits._
def doubleit[A : Numeric](a: A): A = a + a
解释:
写 [A : Integral]
使函数接收类型 Integral[A]
的隐式参数。所有基本整数类型的隐式都已在 Scala 中定义,因此您可以直接将其与 Int
或 BigInt
一起使用。也可以通过定义类型为 Integral[NewIntegralType]
的新隐式变量并实现所有必要的方法来定义新的 Integral
类型。
调用 implicitly[Integral[A]]
returns 这个 Integral[A]
的隐式实例,它具有用于加法的方法 plus
,以及用于对积分执行其他操作的其他方法。
我想写一个函数,大概是这样的:
def doubleit[A](a: A): A = {a + a}
但我希望 'A' 表示任何类型的 Int,但不是任何东西。有没有办法让 Scala 知道我想要 'A' 的意思?
def doubleit[A <: Int](a: A): A = {a + a}
被编译器拒绝。
在普通的 Scala 中你可以使用类型 class Integral
:
scala> def doubleit[A : Integral](a: A): A = implicitly[Integral[A]].plus(a, a)
doubleit: [A](a: A)(implicit evidence: Integral[A])A
scala> doubleit(2)
res0: Int = 4
scala> doubleit(BigInt(4))
res1: scala.math.BigInt = 8
另一种可能的语法:
def doubleit[A](a: A)(implicit ev: Integral[A]): A = ev.plus(a, a)
ev
是那些隐式参数的常用名称。
也可以使用+
、-
等普通操作代替plus
和minus
:
def doubleit[A](a: A)(implicit ev: Integral[A]): A = {
import ev._
a + a
}
或者按照@KChaloux 的建议,预先从 Integral.Implicits
导入:
import Integral.Implicits._
def doubleit[A : Integral](a: A): A = a + a
如果您希望函数不仅支持整数,还支持 Double
s、BigDecimal
s 等,您可以使用 Numeric
而不是 Integral
:
import Numeric.Implcits._
def doubleit[A : Numeric](a: A): A = a + a
解释:
写 [A : Integral]
使函数接收类型 Integral[A]
的隐式参数。所有基本整数类型的隐式都已在 Scala 中定义,因此您可以直接将其与 Int
或 BigInt
一起使用。也可以通过定义类型为 Integral[NewIntegralType]
的新隐式变量并实现所有必要的方法来定义新的 Integral
类型。
调用 implicitly[Integral[A]]
returns 这个 Integral[A]
的隐式实例,它具有用于加法的方法 plus
,以及用于对积分执行其他操作的其他方法。