Suche…


Syntax

  • Klasse Meter (Wert: doppelt) erweitert AnyVal
  • Typ Meter = Doppelt

Bemerkungen

Es wird empfohlen, Werteinheiten für Einheiten oder eine dedizierte Bibliothek für sie zu verwenden.

Geben Sie Aliase ein

type Meter = Double

Dieser einfache Ansatz hat gravierende Nachteile für die Handhabung von Einheiten, da jeder andere Typ, der ein Double ist, damit kompatibel ist:

type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d

Alle obigen Kompilierungen, so dass Einheiten in diesem Fall nur zum Markieren von Eingabe- / Ausgabearten für die Codeleser (nur die Absicht) verwendet werden können.

Wertklassen

case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal

Werteklassen bieten eine typsichere Methode zum Codieren von Einheiten, auch wenn sie etwas mehr Zeichen benötigen, um sie zu verwenden:

var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter

Durch die Erweiterung von AnyVal s besteht keine Laufzeitstrafe für deren Verwendung. Auf JVM-Ebene handelt es sich dabei um reguläre primitive Typen (in diesem Fall Double s).

Falls Sie automatisch andere Einheiten generieren möchten (z. B. Velocity aka MeterPerSecond ), ist dieser Ansatz nicht der beste, obwohl es auch Bibliotheken gibt, die in diesen Fällen verwendet werden können:



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow