Zusätzlich zu denen in der Antwort von mfulton26 gibt es eine vierte Option.
Mit dem ?.
Operator können sowohl Methoden als auch Felder aufgerufen werden, ohne let
lokale Variablen zu behandeln oder zu verwenden.
Code für den Kontext:
var factory: ServerSocketFactory = SSLServerSocketFactory.getDefault();
socket = factory.createServerSocket(port)
socket.close()//smartcast impossible
socket?.close()//Smartcast possible. And works when called
Es funktioniert mit Methoden, Feldern und all den anderen Dingen, die ich versucht habe, damit es funktioniert.
Um das Problem zu lösen, können Sie ?.
die Methoden aufrufen , anstatt manuelle Umwandlungen oder lokale Variablen verwenden zu müssen.
Als Referenz wurde dies in Kotlin getestet 1.1.4-3
, aber auch in 1.1.51
und 1.1.60
. Es gibt keine Garantie, dass es auf anderen Versionen funktioniert, es könnte eine neue Funktion sein.
Die Verwendung des ?.
Operators kann in Ihrem Fall nicht verwendet werden, da es sich um eine übergebene Variable handelt, die das Problem darstellt. Der Elvis-Operator kann als Alternative verwendet werden und erfordert wahrscheinlich die geringste Menge an Code. Anstatt jedoch zu verwenden continue
,return
könnte auch verwendet werden.
Die Verwendung von manuellem Casting könnte ebenfalls eine Option sein, dies ist jedoch nicht null sicher:
queue.add(left as Node);
Das heißt, wenn sich left in einem anderen Thread geändert hat , stürzt das Programm ab.