Existe uma quarta opção além das da resposta de mfulton26.
Ao usar o ?.
operador, é possível chamar métodos e campos sem lidar com let
ou usar variáveis locais.
Algum código para o contexto:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Funciona com métodos, campos e todas as outras coisas que tentei fazer funcionar.
Portanto, para resolver o problema, em vez de precisar usar projeções manuais ou variáveis locais, você pode usar ?.
para chamar os métodos.
Para referência, isso foi testado em Kotlin 1.1.4-3
, mas também testado em 1.1.51
e 1.1.60
. Não há garantia de que funcione em outras versões; pode ser um novo recurso.
O uso do ?.
operador não pode ser usado no seu caso, já que é uma variável transmitida que é o problema. O operador Elvis pode ser usado como uma alternativa e provavelmente é o que requer a menor quantidade de código. Em vez de usar continue
, porém, return
também pode ser usado.
O uso da transmissão manual também pode ser uma opção, mas isso não é seguro para nulos:
queue.add(left as Node);
Ou seja, se a esquerda foi alterada em um segmento diferente, o programa falhará.