How to force Scala to not use origin of type aliases? -


i created type mystring = string.

now want function accept mystring, not string, latter should not compile @ all.

def myfunc(s: mystring) = println(s) accepts both string , mystring args:

scala> type mystring = string defined type alias mystring  scala> def myfunc(s: mystring) = println(s) myfunc: (s: mystring)unit  scala> val s1: mystring = "aaa" s1: mystring = aaa  scala> myfunc(s1) aaa  scala> val s2: string = "aaa" s2: string = aaa  scala> myfunc(s2) aaa  scala> trait mystring extends string <console>:10: error: illegal inheritance final class string        trait mystring extends string                               ^  scala> s1 res7: mystring = aaa  scala> s2 res8: string = aaa  scala> s1 == s2 res9: boolean = true 

with

type mystring = string 

you stating type mystring is string, useable (largely) interchangeably within scope both defined.

to enforce usage of mystring on string, can define wrapper class instead:

case class mystring(value: string) extends anyval 

note: extending anyval prevents class being instantiated @ runtime - see value classes more info.

you restriction on function parameter values want way, although come @ cost of needing explicitly instantiate instances of new type:

scala> val s1: mystring = mystring("aaa") s1: mystring = aaa  scala> myfunc(s1) aaa  scala> val s2: string = "aaa" s2: string = aaa  scala> myfunc(s2) <console>:12: error: type mismatch;  found   : string  required: mystring               myfunc(s2)                      ^ 

Comments

Popular posts from this blog

php - Invalid Cofiguration - yii\base\InvalidConfigException - Yii2 -

How to show in django cms breadcrumbs full path? -

ruby on rails - npm error: tunneling socket could not be established, cause=connect ETIMEDOUT -