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() {}

}

results matching ""

    No results matching ""