Одним из ограничений классов значений является то, что x.isInstanceOf[ValueClass]
все еще должен работать правильно. Где правильно означает: прозрачно, без необходимости знать программисту, когда значения могут быть или не быть помещены в квадрат.
Если Array[Meter]
будет представлен как Array[Int]
во время выполнения, следующий код не будет работать как ожидается, потому что информация о том, что значения в массиве на самом деле являются метрами, теряется.
class Meter(val value: Int) extends AnyVal
def centimeters[A](as: Array[A]) = as.collect{ case m: Meter => m.value * 100 }
Обратите внимание, что если у вас есть val m = new Meter(42); m.isInstanceOf[Meter]
, то компилятор знает, что m
- это Meter
, даже если он Int
во время выполнения, и он может встроить isInstanceOf
вызов true
.
Также обратите внимание, что это не будет работать для массивов. Если бы вы поместили значения в массив по требованию, вам нужно было бы создать новый массив, который не был бы прозрачен для программиста, потому что массивы изменчивы и используют равенство ссылок. Это также было бы катастрофой для производительности с большими массивами.