type CountryCode = String @@ CountryCodeTag
String @@ CountryCodeTag
является подтипом String
, т.е. все методы из String
можно использовать напрямую: countryCode.toUpperCase
.
String @@ CountryCodeTag
можно случайно использовать там, где ожидается некоторое String
, т.е. это менее безопасно для типов.
Создавать новые значения немного неудобно: "a".asInstanceOf[String @@ CountryCodeTag]
или val tagger = new Tagger[CountryCodeTag]; tagger("a")
.
Зависимость от Shapeless (хотя это можно сделать вручную).
class CountryCode(code: String) extends AnyVal
Это более безопасно для типов.
Методы из String
доступны с некоторыми дополнительными усилиями:
class CountryCode(val code: String) extends AnyVal
new CountryCode(countryCode.code.toUpperCase)
or
class CountryCode(val code: String) extends AnyVal
object CountryCode {
def unapply(...) = ...
}
countryCode match { case CountryCode(code) => new CountryCode(code.toUpperCase) }
or
case class CountryCode(code: String) extends AnyVal
countryCode.copy(code = countryCode.code.toUpperCase)
Создание новых значений немного более естественно: new CountryCode("a")
.
Никаких лишних зависимостей (это обычный Scala).
person
Dmytro Mitin
schedule
14.10.2017