Поиск…


Синтаксис

  • class Meter (val meter: Double) расширяет AnyVal
  • тип Meter = Double

замечания

Рекомендуется использовать классы значений для единиц или выделенной библиотеки для них.

Тип псевдонимов

type Meter = Double

Этот простой подход имеет серьезные недостатки для обработки элементов, поскольку любой другой тип, который является Double будет совместим с ним:

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

Все перечисленные выше компиляции, поэтому в этом случае единицы могут использоваться только для маркировки типов ввода / вывода для считывателей кода (только для намерения).

Классы значений

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

Классы значений предоставляют безопасный тип кодирования единиц, даже если для их использования требуется несколько больше символов:

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

Расширяя AnyVal s, для их использования нет штрафа за выполнение, на уровне JVM это обычные примитивные типы (в данном случае это Double ).

Если вы хотите автоматически генерировать другие единицы (например, Velocity aka MeterPerSecond ), этот подход не самый лучший, хотя есть библиотеки, которые также могут использоваться в этих случаях:



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow