В ответе 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);
Это означает, что если левая сторона изменилась в другом потоке, программа завершится сбоем.