Как выглядят определяемые пользователем -классы значений из Java?

Я думаю, что понимаю новую функцию «класса значений» Scala 2.10 по сравнению с Haskell newtype:

trait BoundedValue[+This] extends Any { this: This =>

  def upperBound: This

  def lowerBound: This

}

class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] {

  val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

  override val upperBound: Probability = new Probability(0.0)

  override val lowerBound: Probability = new Probability(1.0)

  // Implement probability arithmetic here;
  // will be represented by Double at runtime.

}

. У меня возникает вопрос: как выглядит класс значений в Java-коде, использующем пакет Scala, в котором он объявлен? Появляется ли класс значения как ссылочный класс со стороны Java или он полностью стерт (и, таким образом, отображается как тип, который он обертывает )? Другими словами, насколько безопасными являются классы значений типа -, если на уровне исходного кода используется Java?


РЕДАКТИРОВАТЬ

Приведенный выше код не будет компилироваться, согласно документу SIP -15 (, связанному с ответом Дэниела ), потому что классам значений не разрешено иметь какую-либо логику инициализации, потому что либо vдолжен быть явно val или Probabilityдолжны иметь метод unboxи соответствующий метод boxдля сопутствующего объекта, а также потому, что классы значений должны иметь ровно одно поле. Правильный код:

trait BoundedValue[This <: BoundedValue[This]] extends Any { this: This =>

  def upperBound: This

  def lowerBound: This

}

class Probability private[Probability] (value: Double) extends AnyVal with BoundedValue[Probability] {

  @inline override def upperBound: Probability = new Probability(0.0)

  @inline override def lowerBound: Probability = new Probability(1.0)

  @inline def unbox: Double = value

  // Implement probability arithmetic here;
  // will be represented by Double at runtime (mostly).

}

object Probability {

  @throws(classOf[IllegalArgumentException])
  def box(v: Double): Probability = if ((v >= 0.0) && (v <= 1.0)) new Probability(v) else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

}

Однако сам вопрос по-прежнему актуален.

8
задан Ptharien's Flame 1 July 2012 в 18:15
поделиться