C'è una quarta opzione oltre a quelle nella risposta di mfulton26.
Utilizzando l' ?.operatore è possibile chiamare metodi e campi senza occuparsi leto 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.51e 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 continueperò, returnpotrebbe 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.