Firebases snapshot.getValue()
erwartet, wie folgt aufgerufen zu werden:
Ich möchte jedoch Person
durch einen generischen Parameter ersetzen, der über die Klassen-Deklaration, d. h.
und verwenden Sie diesen generischen Parameter, um so etwas zu tun:
%Vor%Aber wenn ich versuche, bekomme ich einen Fehler, der besagt, dass
Nur Klassen können auf der linken Seite eines Klassenliterals verwendet werden
Ist es möglich, eine Klassenbeschränkung für den generischen Parameter wie in C # anzugeben oder gibt es eine andere Syntax, die ich verwenden kann, um die Typinformation für den generischen Parameter zu erhalten?
Für eine Klasse mit dem generischen Parameter T können Sie dies nicht tun, weil Sie keine Typinformation für T haben, da die JVM die Typinformation löscht. Daher kann Code wie dieser nicht funktionieren:
%Vor%Aber Sie können das machen, wenn der Typ von T verdinglicht und innerhalb einer Inline-Funktion verwendet wird:
%Vor%Beachten Sie, dass die Inline-Funktion public nur auf öffentliche Member der Klasse zugreifen kann. Aber Sie können zwei Varianten der Funktion haben, eine, die einen Klassenparameter empfängt, der nicht inline ist und auf private Interna zugreift, und eine weitere Inline-Hilfsfunktion, die die Verdinglichung aus dem abgeleiteten Typparameter durchführt:
%Vor% Sie können auch KClass
anstelle von Class
verwenden, so dass Anrufer, die nur Kotlin-only sind, einfach MyClass::class
anstelle von MyClass::class.java
Wenn die Klasse mit der Inline-Methode für die Generika zusammenarbeiten soll (dh, die Klasse Storage
speichert nur Objekte vom Typ T
):
Der Link zu verdinglichten Typen in Inline-Funktionen: Ссылка
Tags und Links kotlin