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

Мне кажется, я понимаю новый "класс значений" особенность Scala 2.10 по сравнению с Haskellnewtype:

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 используется на уровне исходного кода?

EDIT

Приведенный выше код не будет скомпилирован в соответствии с документом SIP-15 (ссылка на который содержится в ответе Даниэля), поскольку классы значений не могут иметь никакой логики инициализации, поскольку либоv должно быть явно валь или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]")

}

Однако сам вопрос остается в силе, как есть.

Ответы на вопрос(1)

Ваш ответ на вопрос