Istnieje czwarta opcja oprócz tych w odpowiedzi mfulton26.
Za pomocą ?.operatora można wywoływać metody oraz pola bez zajmowania się letlub używania zmiennych lokalnych.
Trochę kodu dla kontekstu:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Działa z metodami, polami i wszystkimi innymi rzeczami, które próbowałem uruchomić.
Aby więc rozwiązać problem, zamiast konieczności ręcznego rzutowania lub używania zmiennych lokalnych, możesz użyć ?.metody wywoływania metod.
Dla porównania przetestowano to w Kotlinie 1.1.4-3, ale także w 1.1.51i 1.1.60. Nie ma gwarancji, że działa w innych wersjach, może to być nowa funkcja.
W tym ?.przypadku nie można użyć operatora, ponieważ jest to przekazywana zmienna, która jest problemem. Alternatywą może być operator Elvisa, który prawdopodobnie wymaga najmniejszej ilości kodu. Zamiast używać continue, returnmożna również użyć.
Opcjonalne może być także użycie ręcznego rzutowania, ale nie jest to bezpieczne:
queue.add(left as Node);
Oznacza to, że jeśli lewo zmieniło się w innym wątku, program się zawiesi.