多态方法中的Scala类型转换

多态方法中的Scala类型转换,scala,polymorphism,Scala,Polymorphism,在使用Java一段时间后,我对Scala相当陌生,所以如果这是一个基本问题,我很抱歉。我有一个方法,我想在浮点或双精度中运行,它似乎很容易使用Scala的多态性。在Java中,我发现实现这一点的唯一方法是重载该方法,让一个接受浮点参数,另一个接受双参数,但我希望多态性可以让我避免这种情况,让一个方法可以处理这两个参数。到目前为止,我实现它的方式如下(关于如何使泛型操作在参数之间工作): 这对于双精度很好,但如果我尝试在Float中运行它,则会导致ClassCastException。我可以通过将

在使用Java一段时间后,我对Scala相当陌生,所以如果这是一个基本问题,我很抱歉。我有一个方法,我想在浮点或双精度中运行,它似乎很容易使用Scala的多态性。在Java中,我发现实现这一点的唯一方法是重载该方法,让一个接受浮点参数,另一个接受双参数,但我希望多态性可以让我避免这种情况,让一个方法可以处理这两个参数。到目前为止,我实现它的方式如下(关于如何使泛型操作在参数之间工作):

这对于双精度很好,但如果我尝试在Float中运行它,则会导致ClassCastException。我可以通过将其更改为
2.0.toFloat.asInstanceOf[a]
来硬编码一个解决方案,这让我觉得必须有某种方法来实现这一点,但这样的硬编码无法使其通用化。我还必须做一些看起来不成比例的工作,通过使用这个答案来让部门正常工作,并在此基础上进行构建,以得到一个比工作更少的结果


本质上,我想要的是能够指定方法应该运行和返回的精度。问题来自于将方法中使用的其他变量强制转换为适当的类型,因为
。除非[A]
的实例已经是正确的类型,否则它不起作用。

下面是一个使用以下方法的简短解决方案:

def Sample[A: Numeric](x: A, y: A)(implicit num: Numeric[A]): A = {
  num.times(
    num.fromInt(2),
    num.times(x, y)
  )
}
这允许first使用重载算术运算符解决任何歧义。这里的实际关键是
fromInt
方法的使用,因此我们可以使用操作符将其写得更短(就像在代码中一样):

def Sample[A: Numeric](x: A, y: A)(implicit num: Numeric[A]): A = {
  import num._
  fromInt(2) * x * y
}
这里不需要任何铸造(在这个特殊的例子中)。下面是一个用法演示:

scala> Sample(2.5D, 0.01D)
res12: Double = 0.05

scala> Sample(2.5F, 0.01F)
res13: Float = 0.049999997

对于更一般的情况,当你只需要一些数字而不是
2
,并且你不知道你想要它是哪种类型,我认为,你不能用一个多态函数来解决它。您可以定义一个typeclass,并为您希望它使用的特定类型()提供隐式实例。

哇,感谢您的快速响应!当一次使用大量操作时,有没有办法使它更简洁?像num.times(num.fromInt(2),num.times(x,num.plus(num.fromInt(1),y))这样的代码与2*x*(1+y)@user6247850实际上是的,只是在原始代码中。我将添加此选项。另请参阅我关于一般情况的更新。
scala> Sample(2.5D, 0.01D)
res12: Double = 0.05

scala> Sample(2.5F, 0.01F)
res13: Float = 0.049999997