如何从Java调用具有数值参数的Scala方法

时间:2018-08-27 05:49:21

标签: java scala

我有一个采用Numeric[T]对象的Scala方法:

def needNumeric[T](value: T)(implicit n: Numeric[T]) = {
  // do something
}

如何从Java调用此方法?我想出的最好方法是:

needNumeric(0, scala.math.Numeric.IntIsIntegral$.MODULE$);

但是代码看起来很丑陋,不是很通用。有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

Java支持多态方法,那么这样的事情呢?

object original {
  def needNumeric[T](value: T)(implicit n: Numeric[T]) = {
    // do something
  }
}

object NeedNumeric {
  def needNumeric(value: Int) = original.needNumeric(value)
  def needNumeric(value: Long) = original.needNumeric(value)
  def needNumeric(value: Float) = original.needNumeric(value)
  def needNumeric(value: Double) = original.needNumeric(value)
  def needNumeric(value: BigInt) = original.needNumeric(value)
  ...
}

import NeedNumeric._

必须枚举类型很繁琐(这就是Scala使用类型类的原因),但是对于数值来说应该可以,因为没有太多的数值类型。


如果这是您自己的needNumeric方法,请注意,签名可以简化为此:

def needNumeric[T: Numeric](value: T) = {

答案 1 :(得分:1)

针对丑陋问题的一个小解决方法:定义类似Java的便捷访问方式

class Numerics {
    public static final Numeric<Integer> INTEGER = Numeric.IntIsIntegral$.MODULE$;

    public static final Numeric<Double> DOUBLE = Numeric.DoubleIsFractional$.MODULE$;

    ...
}

折衷方案是它允许调用任何需要Numeric的方法而无需对其进行修改。