Smart Casts
In molti casi, non è necessario utilizzare gli operatori di cast espliciti in Kotlin, in quanto il compilatore traccia i controlli fatti (tramite l'operatore is) e i cast sicuri si fanno automaticamente quando necessario:
fun demo(x: Any) {
if (x is String) {
print(x.length) // x is automatically cast to String
}
}
Il compilatore è abbastanza bravo e permette anche questo:
if (x !is String) return
print(x.length) // x is automatically cast to String
O questo:
// x is automatically cast to string on the right-hand side of ||
if (x !is String || x.length == 0) return
// x is automatically cast to string on the right-hand side of &&
if (x is String && x.length > 0) {
print(x.length) // x is automatically cast to String
}
E perfino questo:
when (x) {
is Int -> print(x + 1)
is String -> print(x.length + 1)
is IntArray -> print(x.sum())
}
"Unsafe" cast operator
Invece il modo più veloce ed insicuro per fare i cast è tramite l'operatore as:
val x: String = y as String
Però questo operatore lancia una ClassCastException se non è possibile eseguire la conversione. Vedremo, dopo aver introdotto la null safety l'operatore per fare cast sicuri.
Impedire l’overriding
Prima di introdurre le classi astratte ci soffermiamo su come è possibile impedire l'ovveriding. Ad esempio, se prendiamo in considerazione una classe che contiene metodi che svolgono operazioni fondamentali (come la connessione ad un database, il parsing di documenti XML e così via), possiamo decidere di non permettere la ridefinizione di questi metodi che potrebbe causare instabilità all’interno della gerarchia e di conseguenza di tutta l’applicazione. Un membro targato con la keyword override è sovrascrivibile come se fosse un metodo open. Proprio per impedire questo i creatori di Kotlin hanno pensato di lasciare, la keyword final, di Java:
open class AnotherDerived() : Base() {
final override fun v() {}
}