For a week I have been removing features from Skila (so far just two) and postponing some nice things for later implementation — I still want Skila to look at least nicely. Ironically that easy subset is not that easy to grasp, currently I hit hard on nullable types. So far I could see three camps:
- C# — implicit null-check with null values (there are no referential non-nullable types though),
- Kotlin camp — explicit null-check with null values,
- Swift camp — as Kotlin but with wrapper class “
Option
” instead of null.
Take my words with grain of salt because I don’t know Kotlin or Swift.
Using “null
” is not the same as having “Option
”, the second can be wrapped as many times as you like when in case of the former you cannot wrap “null
” into “null
” — it is a value, not a wrapper.
On the other hand all checks designed for nullable type can be applied to non-nullable type, this is not true with optional types. For example one can blindly execute “x != null
” check in Kotlin, while the analogous code in Swift requires “x
” to be really an “Option
”.
Worse, both Kotlin and Swift approaches bring problems to Skila, for example — how do you initialize objects of generic type? If I choose Kotlin solution how does inheritance tree look like for nullable types? And even if I choose Kotlin approach indeed I know that “Option
” type will have to be added as well, so maybe add it right from the beginning… and so on and on.
Just to increase my confusion I found out some inconsistency in Kotlin:
open class Foo { fun foo() : Int { return 0; } } fun test<T : Foo?>(x : T) : Int { return x.foo() // (*) } fun main(args : Array<String>) { println(test<Foo?>(null)) }
Compiler should demand “x!!.foo()
” in line marked with “(*)”, but the code above compiles without any errors. And it worries me for Skila — those two ideas (generics with nullable/optional types) are not easy and it is hard to foresee (at least for me) all the problems with writing generic classes in practice.
If you are curious you can play online with both languages — playground for Swift and for Kotlin.