Jak wyglądają klasy wartości zdefiniowane przez użytkownika z języka Java?

Myślę, że rozumiem nową funkcję „klasy wartości” Scala 2.10 w porównaniu z Haskellemnewtype:

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.

}

Mam pytanie, w jaki sposób klasa wartości pojawia się w kodzie Java korzystającym z pakietu Scala, w którym jest zadeklarowana? Czy klasa wartości pojawia się jako klasa odniesienia od strony Java, czy jest całkowicie usuwana (a zatem pojawia się jako typ, który zawija)? Innymi słowy, w jaki sposób bezpieczny typ jest klasą wartości, gdy Java jest zaangażowana na poziomie źródłowym?

EDYTOWAĆ

Powyższy kod nie zostanie skompilowany zgodnie z dokumentem SIP-15 (połączonym w odpowiedzi Daniela), ponieważ klasy wartości nie mogą mieć żadnej logiki inicjalizacji, ponieważ albov musi być jawnie val lubProbability musi miećunbox metoda i odpowiadającebox metoda na obiekt towarzyszący i ponieważ klasy wartości muszą mieć dokładnie jedno pole. Prawidłowy kod to:

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

}

Samo pytanie jest jednak nadal aktualne.

questionAnswers(1)

yourAnswerToTheQuestion