Istnieje czwarta opcja oprócz tych w odpowiedzi mfulton26.
Za pomocą ?.
operatora można wywoływać metody oraz pola bez zajmowania się let
lub 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.51
i 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
, return
moż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.