泛型 – 如何使用Value [T:Numeric]使代码更“灵活”,就像“未装箱”的对应​​物一样?

如果我有像5 * 5.0的代码,结果将转换为最准确的类型,Double.

但这似乎不适用于代码

case class Value[T : Numeric](value: T) {
    type This = Value[T]
    def +(m: This) = Value[T](implicitly[Numeric[T]].plus(value,m.value))
    ...
}

implicit def numToValue[T : Numeric](v: T) = Value[T](v)

有没有办法让someIntValue像double一样工作,其中someIntValue是Value [Int]而double是Double?

PS:对不起完美的标题感到抱歉.我很感谢有关更好措辞的建议……

解决方法

您可以通过创建隐式运算符来执行此操作(通过大量繁忙工作):

abstract class Arith[A,B,C] {
  def +(a: A,b: B): C
  def -(a: A,b: B): C
  def *(a: A,b: B): C
  def /(a: A,b: B): C
}
implicit object ArithIntLong extends Arith[Int,Long,Long] {
  def +(a: Int,b: Long) = a+b
  def -(a: Int,b: Long) = a-b
  def *(a: Int,b: Long) = a*b
  def /(a: Int,b: Long) = a/b
}
...
def f[A,C](a: A,b: B)(implicit arith: Arith[A,C]) = arith.*(a,b)


scala> f(5,10L)
res46: Long = 50

但是你真的必须做更多的事情,因为你需要A和B的Numeric等价物,并且需要双向定义非对称操作.鉴于涉及三种类型,专业化并不实际.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...