2015-05-27 3 views
2

В Java я могу работать с Number как тоКак работать с числовым типом scala?

public void myFunction(Number number) { 
    double innerVar = 1.0; //initial value 
    if (number != null) { 
     innerVar += number.doubleValue(); 
    } 
    //do other logic 
} 

Если мне нужно работать с Integer я могу заменить doubleValue код с intValue.

Но scala.math.Numeric не имеет таких методов, как toDouble(x:T) Я не знаю, что здесь представляет x:T. Также, если вы видите scala.Double или scala.Short, у них есть метод toDouble, но эти методы не наследуются от одного признака.

можно использовать поиск по шаблону, но есть много дублирования кода с toDouble:

val myNum:AnyVal = ... 
var innerDouble = 1.0 
myNum match { 
    case Double => innerDouble + myNum 
    case Short => innerDouble.toDouble + myNum 
    case Int => innerDouble.toDouble + myNum 
} 

или другой вариант

val myNum:AnyVal = ... 
var innerDouble = 1.0 
myNum match { 
    case Double | Short | Int | Long => innerDouble.toDouble + myNum 
    case _ => 
} 

Так как есть лучший способ работы с работой с Числовые типы с Scala?

P.S.

Я читал о границах обзора в scala как <% double, но не знаю, как их можно использовать при сопоставлении с образцом.

ОБНОВЛЕНО

Here похож вопрос, но это о классах и параметров в ней, мне нужно решение для использования при сопоставлении с образцом.

+2

Проверьте этот другой вопрос здесь: http://stackoverflow.com/questions/17999409/scala-equivalent-of-javas-number – anquegi

+0

Проверено, но не понятно, как его использовать при сопоставлении с образцом. :( – Cherry

+0

@Cherry Точка использования 'Numeric' заключается в том, что вам не нужно использовать сопоставление шаблонов, чтобы добавить' myNum' в 'innerDouble'. –

ответ

0

Возможный способ обхода, грязная альтернатива Numeric класса типа, чтобы получить строковое представление myNum и разобрать его с помощью String.toDouble:

val myNum:AnyVal = ... 
var innerDouble = 1.0 

val res = myNum.toString.toDouble + innerDouble 

Если myNum не содержит распознаваема как двойное значение, синтаксические шаг будет бросать NumberFormatException

Это не элегантный, но код короткий.

Подводя итог, можно использовать Numeric:

def myFunction[T : Numeric](number: T) = { 
    var innerVar = 1.0; 
    innerVar = implicitly[Numeric[T]].toDouble(number) + innerVar; 
    innerVar 
} 

Или воспользоваться струнным разбором:

def myFunction(number: AnyVal) = { 
    var innerVar = 1.0; 
    innerVar = number.toString.toDouble + innerVar; 
    innerVar 
} 

Будучи вторым вариантом формально уродливее, это позволяет реальные аргументы в пользу number таких как "3.3" ,