В ответе mfulton26 есть четвертый вариант.
Используя ?.оператор, можно вызывать как методы, так и поля, не обращаясь к letлокальным переменным и не используя их.
Некоторый код для контекста:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Он работает с методами, полями и всем остальным, что я пытался заставить его работать.
Таким образом, чтобы решить проблему, вместо использования ручного приведения или использования локальных переменных, вы можете использовать ?.для вызова методов.
Для справки, это было проверено в Kotlin 1.1.4-3, но также проверено в 1.1.51и 1.1.60. Там нет гарантии, что он работает на других версиях, это может быть новая функция.
Использование ?.оператора не может быть использовано в вашем случае, поскольку проблема заключается в передаваемой переменной. В качестве альтернативы можно использовать оператор Элвиса, и, вероятно, он требует наименьшего количества кода. Вместо использования, continueхотя, returnтакже может быть использован.
Можно также использовать ручное приведение, но это небезопасно:
queue.add(left as Node);
Это означает, что если левая сторона изменилась в другом потоке, программа завершится сбоем.