Wie sehen benutzerdefinierte Wertklassen in Java aus?

Ich glaube, ich verstehe die neue "Wertklassen" -Funktion von Scala 2.10 im Vergleich zu der von 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.

}

Die Frage, die ich habe, ist, wie eine Werteklasse in Java-Code erscheint, der das Scala-Paket verwendet, in dem sie deklariert ist. Erscheint die Wertklasse als Referenzklasse von der Java-Seite aus oder wird sie vollständig gelöscht (und erscheint daher als Typ, den sie umschließt)? Mit anderen Worten, wie typsicher sind Wertklassen, wenn Java auf der Quellebene beteiligt ist?

BEARBEITEN

Der obige Code wird laut SIP-15-Dokument (in Daniels Antwort verlinkt) nicht kompiliert, da Wertklassen aus diesem Grund auch keine Initialisierungslogik haben dürfenv muss explizit ein Wert sein oderProbability muss eine habenunbox Methode und eine entsprechendebox Methode für das zugehörige Objekt, und weil Wertklassen genau ein Feld haben müssen. Der richtige Code lautet:

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

}

Die Frage selbst ist jedoch weiterhin gültig.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage