Как вызвать метод Scala с числовым параметром из Java - PullRequest
0 голосов
/ 27 августа 2018

У меня есть метод Scala, который принимает объект Numeric[T]:

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

Как мне вызвать этот метод из Java?Лучший способ, которым я придумал, это:

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

Но код выглядит некрасиво и не очень общий.Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Небольшой обходной путь для проблемы уродства: определите удобный для Java доступ, например

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

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

    ...
}

. Компромисс состоит в том, что он позволяет вызывать любой метод, требующий Numeric s, без его изменения.

0 голосов
/ 27 августа 2018

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) = {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...