C'è una quarta opzione oltre a quelle nella risposta di mfulton26.
Utilizzando l' ?.
operatore è possibile chiamare metodi e campi senza occuparsi let
o utilizzare variabili locali.
Alcuni codici per il contesto:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Funziona con metodi, campi e tutte le altre cose che ho provato a farlo funzionare.
Quindi, al fine di risolvere il problema, invece di utilizzare i cast manuali o le variabili locali, è possibile utilizzare ?.
per chiamare i metodi.
Per riferimento, questo è stato testato in Kotlin 1.1.4-3
, ma anche testato in 1.1.51
e 1.1.60
. Non c'è garanzia che funzioni su altre versioni, potrebbe essere una nuova funzionalità.
L'uso ?.
dell'operatore non può essere utilizzato nel tuo caso poiché è una variabile passata il problema. L'operatore Elvis può essere utilizzato come alternativa ed è probabilmente quello che richiede la minima quantità di codice. Invece di usare continue
però, return
potrebbe anche essere usato.
L'uso del casting manuale potrebbe anche essere un'opzione, ma questo non è nullo sicuro:
queue.add(left as Node);
Significa che se il tasto sinistro è cambiato su un thread diverso, il programma si arresterà in modo anomalo.