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

如何从Java调用具有数值参数的Scala方法,java,scala,Java,Scala,我有一个Scala方法,它接受一个Numeric[T]对象: def needNumeric[T](value: T)(implicit n: Numeric[T]) = { // do something } 如何从Java调用此方法?我想出的最好办法是: needNumeric(0, scala.math.Numeric.IntIsIntegral$.MODULE$); 但是代码看起来很难看,也不是很通用。有更好的方法吗?Java支持多态方法,那么像这样的方法怎么样: object

我有一个Scala方法,它接受一个
Numeric[T]
对象:

def needNumeric[T](value: T)(implicit n: Numeric[T]) = {
  // do something
}
如何从Java调用此方法?我想出的最好办法是:

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

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

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) = {

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) = {

解决丑陋问题的一个小办法是:定义Java便捷访问,如

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

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

    ...
}
类数值{
public static final Numeric INTEGER=Numeric.IntIsIntegral$.MODULE$;
public static final Numeric DOUBLE=Numeric.doubleisfractal$.MODULE$;
...
}

折衷的办法是,它允许调用任何需要
Numeric
s的方法,而无需修改它。

解决这个丑陋问题的一个小办法是:定义Java便捷访问,如

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

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

    ...
}
类数值{
public static final Numeric INTEGER=Numeric.IntIsIntegral$.MODULE$;
public static final Numeric DOUBLE=Numeric.doubleisfractal$.MODULE$;
...
}

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

尝试从编译的
Scala
code生成的
bytecode
中获取提示您必须直接从Java调用此方法吗?或者您可以创建一些调用此方法的新Scala方法吗?@Tim Scala helper方法也可以,但我发现的唯一方法是创建一个
needNumericJava(value:Any)
,然后对数值类型进行模式匹配
value
,并调用
needNumeric()
,这看起来也很冗长。试着从编译的
Scala
code生成的
Java
字节码中获取提示您必须直接从Java调用此方法吗?或者你可以创建一些新的Scala方法来调用这个方法吗?@Tim Scala helper方法也可以,但是我发现唯一的方法是创建一个
needNumericJava(value:Any)
,然后对数值类型进行模式匹配
value
,并调用
needNumeric()
,这看起来也非常冗长。