Как мне представить коробочный дубль в чистом Scala? - PullRequest
9 голосов
/ 11 октября 2011

В Scala есть 2 представления чисел двойной точности, одно - AnyVal, другое AnyRef. На JVM они отображаются на примитив double и класс java.lang.Double соответственно.

Что теперь происходит на платформах, отличных от JVM? Я могу использовать Scala.Double для примитива, но как мне указать, что я хочу указывать ссылку в штучной упаковке Double без указания java.lang.Double?


[Контекст - оставлено, чтобы понять смысл ответа Томаса, но не фундаментальный вопрос.

У меня есть Double, который я хочу добавить с помощью Spring в компонент Wicket:

class MyPanel(id: String) extends Panel(id) {
  @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: Double = _

Если я укажу тип как scala.Double, как указано выше, инжектор выйдет из строя, поскольку он может только вводить объекты.

Если я укажу java.lang.Double в качестве типа поля, все будет хорошо

class MyPanel(id: String) extends Panel(id) {
  @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: java.lang.Double = _

Но я пытаюсь уменьшить свою зависимость от использования Java API, так как я могу представить Double в штучной упаковке без него? ]

Ответы [ 2 ]

11 голосов
/ 11 октября 2011

scala.Double == double на Java. Когда вы ставите scala.Double, он становится java.lang.Double.

scala> val f = 45d;
f: Double = 45.0

scala> println("f=" + f.getClass)
f=double

scala> def foo(d: Any) = println("d=" + d.getClass)
foo: (d: Any)Unit

scala> foo(f)
d=class java.lang.Double

Нет никакого способа создать объект типа scala.Double. Это просто псевдоним для двойника. Поэтому для вашей проблемы вам нужно использовать java.lang.Double или заключить его в свой собственный тип и обеспечить неявные преобразования.

Это определение имеет смысл, если вы об этом думаете. Все взаимодействие между java и scala-кодом, которое требует автоматической коробки и распаковки, будет работать как положено.

Если это имеет значение, вы всегда можете сделать:

type BoxedDouble = java.lang.Double

тогда вам не нужно будет видеть java.lang: -)

0 голосов
/ 11 октября 2011

Почему бы не создать компонент типа scala.Double?Ужасно, но похоже, что оно работает:

<bean id="rxAlarmLimitDb" class="scala.Double" factory-method="unbox">
    <constructor-arg>
        <bean class="java.lang.Double">
            <constructor-arg value="4.2"/>
        </bean>
    </constructor-arg>
</bean>
...