如何从Java调用具有数值参数的Scala方法
我有一个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
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()
,这看起来也非常冗长。