actually, I can sum it up in a relatively simple, ...
# random
c
actually, I can sum it up in a relatively simple, made-up and unrealistic example, which still is entertaining, imho: 3 developers have the same task: narrow down function's argument type as much as they can, without looking at function definition or even the context in which it is called. They are however provided with the fact that
foo(bar)
where bar is of type X is valid and are allowed to try and pass different values to it instead. Java developer checks if X is a primitive and checks for widening conversions and boxing, and narrows it to either a supertype of X or a primitive type. Kotlin developer checks for null and either gets a supertype of X or a nullable supertype of X. Scala developer makes a long "uhhhhh" sound and asks if he can take a peek at imports to at least give him some chance to narrow it beyond "pretty much anything".