Earlier quoted context omitted.
C has very simple types and allows for untyped operations very easily. Say you cast some ptr of type void* to Foo*: at least in Python you would get a dynamic type error if the cast was incorrect; in C you are lucky if your program immediately crashes. C has some static type safety, and virtually no run-time type safety. Java on the other hand, has a lot of static type safety, is completely memory safe (barring bugs…
That's what we have valgrind, test cases and decent software engineers for. Java don't forget suffers as do other languages from lots of nasty things related to types including invalid casts, null reference exceptions etc. When these go phut in production, you're usually in the same situation.
Options, like all collections, can be chained together as such:
for {
x
this expression is of type Option[Int], and will never throw a null pointer exception. (Futures can be chained together with identical syntax)