foo.asInstanceOf[Bar]
is a type cast, which is primarily a runtime operation. It says that the compiler should be coerced into believing that foo
is a Bar
. This may result in an error (a ClassCastException
) if and when foo
is evaluated to be something other than a Bar
at runtime.
foo:Bar
is a type ascription, which is entirely a compile-time operation. This is giving the compiler assistance in understanding the meaning of your code, without forcing it to believe anything that could possibly be untrue; no runtime failures can result from the use of type ascriptions.
Type ascriptions can also be used to trigger implicit conversions. For instance, you could define the following implicit conversion:
implicit def foo(s:String):Int = s.length
and then ensure its use like so:
scala> "hi":Int
res29: Int = 2
Ascribing type Int
to a String
would normally be a compile-time type error, but before giving up the compiler will search for available implicit conversions to make the problem go away. The particular implicit conversion that will be used in a given context is known at compile time.
Needless to say, runtime errors are undesirable, so the extent to which you can specify things in a type-safe manner (without using asInstanceof
), the better! If you find yourself using asInstanceOf
, you should probably be using match
instead.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…