scala - Should I use type, if my "extends AnyVal" has not methods? -


the internet not able answer question yet. 2 lines seem interchangeable me:

type meter = double class meter(val d: double) extends anyval 

if meter not have methods, should use type instead? what's difference?

what's difference?

well, obvious thing first type alias, nothing more. latter attempt unroll wrapping class , use underlying primitive directly. but, there cases anyval can't unwrapped stated in documentation. example, assume wanted pass meter polymorphic function:

def identity[t](t: t): t = t 

passing meter in allocate instance:

scala> class meter(val d: double) extends anyval defined class meter  scala> def identity[t](t: t): t = t identity: [t](t: t)t  scala> :se -xprint:typer  scala> identity(new meter(1.0))  // shortened brevity  private[this] val res0: meter = $line4.$read.$iw.$iw.identity[meter](new $line3.$read.$iw.$iw.meter(1.0)); <stable> <accessor> def res0: meter = $iw.this.res0 

on other hand, type meter yield double:

scala> type meter = double defined type alias meter  scala> val m: meter = 1.0 m: meter = 1.0  scala> def identity[t](t: t): t = t identity: [t](t: t)t  scala> :se -xprint:uncurry  scala> identity(m) private[this] val res1: double = $line5.$read.$iw.$iw.identity[double]($line4.$read.$iw.$iw.m()); <stable> <accessor> def res1(): double = $iw.this.res1 

another sensitivity if allocate array[meter], instance need allocated.

there differences between two. 1 should use? usually, depends. if type safety of outter importance , don't mind edge cases 1 occurs allocation, go class. if have rather complex type want abstract over, example either[string, a] want make type simpler, perhaps type foo[a] = either[string, a] simpler understand , more intuitive.


Comments

Popular posts from this blog

php - How to add and update images or image url in Volusion using Volusion API -

javascript - IE9 error '$'is not defined -