Il y a une quatrième option en plus de celles de la réponse de mfulton26.
En utilisant l' ?.
opérateur, il est possible d'appeler des méthodes ainsi que des champs sans traiter let
ou utiliser des variables locales.
Du code pour le contexte:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Il fonctionne avec des méthodes, des champs et toutes les autres choses que j'ai essayé de faire fonctionner.
Ainsi, afin de résoudre le problème, au lieu d'avoir à utiliser des transtypages manuels ou à l'aide de variables locales, vous pouvez utiliser ?.
pour appeler les méthodes.
Pour référence, cela a été testé dans Kotlin 1.1.4-3
, mais également testé dans 1.1.51
et 1.1.60
. Il n'y a aucune garantie que cela fonctionne sur d'autres versions, cela pourrait être une nouvelle fonctionnalité.
L'utilisation de l' ?.
opérateur ne peut pas être utilisée dans votre cas car c'est une variable transmise qui est le problème. L'opérateur Elvis peut être utilisé comme alternative, et c'est probablement celui qui nécessite le moins de code. Au lieu d'utiliser continue
cependant, return
pourrait également être utilisé.
L'utilisation de la coulée manuelle peut également être une option, mais ce n'est pas sans danger:
queue.add(left as Node);
Ce qui signifie que si la gauche a changé sur un autre thread, le programme plantera.