There's not much info in the spec on what type ascription is, and there certainly isn't anything in there about the purpose for it. Other than "making passing varargs work", what would I use type ascription for? Below is some scala REPL for the syntax and effects of using it.
scala> val s = "Dave"
s: java.lang.String = Dave
scala> val p = s:Object
p: java.lang.Object = Dave
scala> p.length
<console>:7: error: value length is not a member of java.lang.Object
p.length
^
scala> p.getClass
res10: java.lang.Class[_ <: java.lang.Object] = class java.lang.String
scala> s.getClass
res11: java.lang.Class[_ <: java.lang.Object] = class java.lang.String
scala> p.asInstanceOf[String].length
res9: Int = 4
Type ascription is just telling the compiler what type you expect out of an expression, from all possible valid types.
A type is valid if it respects existing constraints, such as variance and type declarations, and it is either one of the types the expression it applies to "is a", or there's a conversion that applies in scope.
So,
java.lang.String extends java.lang.Object
, therefore anyString
is also anObject
. In your example you declared you want the expressions
to be treated as anObject
, not aString
. Since there is no constraints preventing that and the desired type is one of the typess
is a, it works.Now, why would you want that? Consider this:
You could also have fixed this by type ascripting
s
atss
declaration, or you could have declaredss
's type to beSet[AnyRef]
.However, type declarations achieve the same thing only as long as you are assigning a value to an identifier. Which one can always do, of course, if one doesn't care about littering the code with one-shot identifiers. For example, the following does not compile:
But this does:
It would be silly to use an identifier here in place of
Nil
. And though I could just writeList[String]()
instead, that isn't always an option. Consider this, for instance:For the reference, this is what Scala 2.7 spec (march 15, 2009 draft) has to say about type ascription: