¿Cómo se ven las clases de valores definidos por el usuario desde Java?

Creo que entiendo la nueva característica de "clase de valor" de Scala 2.10, en comparación con la de 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.

}

La pregunta que tengo es: ¿cómo aparece una clase de valor en el código Java que usa el paquete Scala en el que está declarado? ¿Aparece la clase de valor como una clase de referencia desde el lado de Java, o se borra por completo (y, por lo tanto, aparece como el tipo que envuelve)? En otras palabras, ¿qué tan seguras son las clases de valor cuando Java está involucrada en el nivel de origen?

EDITAR

El código anterior no se compilará, de acuerdo con el documento SIP-15 (vinculado en la respuesta de Daniel), porque las clases de valor no tienen permitido tener ninguna lógica de inicialización, ya sea quev debe ser explícitamente un val oProbability debe tener ununbox método y un correspondientebox método en su objeto compañero, y porque las clases de valor deben tener exactamente un campo. El código correcto es:

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]")

}

Sin embargo, la pregunta en sí misma sigue siendo válida.

Respuestas a la pregunta(1)

Su respuesta a la pregunta