Ich habe eine Funktion, die ein Argument eines generischen Typs verwendet und ich möchte auf die Klasse davon zugreifen:
%Vor% Dies schlägt fehl mit "Ausdruck im Klassenliteral hat NULL-Typ". Das ist in Ordnung, ich verstehe es (ich könnte Any?
als mein T
und null
als Wert verwenden).
Aber wenn ich es ändere, um sicherzustellen, dass t
nicht-null ist, schlägt es immer noch mit derselben Fehlermeldung fehl:
In welchem Fall kann t!!::class
immer noch Probleme verursachen?
Gibt es eine Möglichkeit, die Klasse ohne Any (oder Casting auf Any) zu bekommen?
Machen Sie den generischen Typ T
nicht-nullbar:
Nach Standard ist die Obergrenze Any?
anstelle von Any
:
"Die Standardobergrenze (falls keine angegeben) ist Any ?. Innerhalb der spitzen Klammern kann nur eine obere Grenze angegeben werden. Wenn derselbe Typparameter mehr als eine obere Grenze benötigt, brauchen wir eine separate where-Klausel."
!!
falsch "Aber wenn ich es ändere, um zu garantieren, dass t nicht-null ist ..."
Dies ist nicht was Sie tun, wenn Sie !!
verwenden. Stattdessen sagen Sie dem Compiler: Ich möchte nicht, dass Sie meinen Typ auf NULL-Kompatibilität überprüfen. Einfach loslegen und diese Funktion aufrufen. Ich habe keine Angst vor NullpointerException
s.
"In welchem Fall kann die t !! :: Klasse immer noch Probleme verursachen?"
Wie ich oben sagte, verursacht es viele Probleme, wenn der Typ, auf den !!
angewendet wird, tatsächlich null
ist. Dann werden wie in Java NPEs zur Laufzeit geworfen.