В следующем примере: я хочу обрезать строку для соответствия определенным ограничениям длины, например, совместимости с типами SQL.
type varchar8 = String
implicit def str2Varchar8(str: String): varchar8 = str.take(8)
val a: varchar8 = "abcdefghi"
// wanted: "abcdefgh", actual result:
a: varchar8 = abcdefghi
Похоже, что компилятор не различает эти два типа.
Учитывая псевдоним типа type A = String
, я пытаюсь добиться:
- , чтобы избежать выделения во время выполнения (т. Е. Класса-оболочки)
- возможность примененияутверждения / преобразования только при отображении из
String
в псевдоним типа A
.т.е. избегать дальнейших утверждений / преобразований при работе непосредственно с псевдонимом типа A
в качестве входных данных
Пример проверки:
type NotNullA = A
def method(a: A) = if(a != null)
_method(a: NotNullA) // explicit typing
else
???
// "a" at runtime is a String but we consider it validated, instead relying on the type system
protected def _method(a: NotNullA) = ???
protected def _otherMethod(a: NotNullA) = ???
Есть ли способ, при котором псевдонимы типов можно рассматривать какотделить от типа, который они псевдоним - и, следовательно, сделать возможным неявные преобразования и проверки типа между ними?Есть ли какое-то другое кодирование / метод, который выполняет эту работу?
Сторона: Кажется, я вспомнил момент, когда два были разделены, а тип и псевдоним были разными (не относящимися к типу).вопрос ари).Мой предыдущий код выглядел примерно так:
type FieldAType = Int
// and in a different class
def method(a: FieldAType) = ???
val b: FieldAType = 1
method(b) // worked
val c: Int = 1
method(c) // compiler error
method(c: FieldAType) // worked
Однако я не смог воспроизвести эту проблему (возможно, из-за более старой версии Scala - в настоящее время используется 2.11.8)