Warum kann ich die Klasse eines generischen Parameters nicht bekommen?

9

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:

%Vor%

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?

    
danielspaniol 12.09.2017, 16:05
quelle

3 Antworten

10

Ändern Sie Ihren Typ, um anzugeben, dass er nicht nullfähig ist, und es sollte funktionieren. Sie können dies tun, indem Sie angeben, dass T Any (und nicht Any? ) erweitern muss.

%Vor%     
Todd 12.09.2017, 16:08
quelle
4

Zuerst beheben wir es

Machen Sie den generischen Typ T nicht-nullbar:

%Vor%

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."

Seite Hinweis: Sie verwenden !! 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.

    
s1m0nw1 12.09.2017 16:42
quelle
2

Sie möchten den Typ reified verwenden. Sie können mehr über die verdinglichten Typparameter hier oder hier . Der Code:

%Vor%     
Maroš Šeleng 12.09.2017 16:41
quelle

Tags und Links