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