2.4.3
Scala
Bitte beschreiben Sie das erwartete Verhalten des Problems ab der ersten Aktion.
Hier gibt es wirklich keinen Widerspruch. Json.format[Foo]
gibt OFormat[Foo]
, was ein Subtyp von Format[Foo]
. Welcher Teil der Dokumentation ist Ihrer Meinung nach falsch?
Normalerweise verwenden Sie beim Deklarieren von Typen die allgemeinste Schnittstelle ( Format
) anstelle eines spezifischeren Implementierungstyps ( OFormat
). Wenn Sie jedoch zusätzliche Manipulationen wie das Hinzufügen von Feldern zum Objekt vornehmen müssen Es ist nützlich, ein OFormat
, das garantiert als JsObject
.
@gmethvin Ich stimme Ihren allgemeinen Kommentaren zu, dass Sie beim Deklarieren von Typen eher die Schnittstelle als den Implementierungstyp verwenden würden. In diesem Fall ist OFormat
jedoch nicht der Implementierungstyp, sondern eine spezifischere Schnittstelle. Da Json.format[Foo]
eine anonyme Implementierung der Schnittstelle OFormat
zurückgibt, würde ich erwarten, dass die Dokumentation OFormat
anstelle von Format
zurückgibt.
Ich habe auch festgestellt, dass die Dokumentation in Play 2.5 aktualisiert wurde, um zu zeigen, dass sie OFormat
anstelle von Format
zurückgibt (https://www.playframework.com/documentation/2.5.x/api) /scala/index.html#play.api.libs.json.Json$). Daher halte ich es für sinnvoll, wenn die Dokumentation für Play 2.4 (und möglicherweise früher) entsprechend aktualisiert wird.
Okay, das Problem ist also nicht die Dokumentation. Das Makro wird so eingegeben, dass Format
, nicht OFormat
: https://github.com/playframework/playframework/blob/2.4.x/framework/src/play-json/src/main /scala/play/api/libs/json/JsMacroImpl.scala#L18h. Da der Code jedoch tatsächlich OFormat
zurückgibt und keine Typanmerkungen vorhanden sind, wird OFormat
Ihrem Code ausgesetzt.
Die Änderung zu OFormat
erfolgte in # 4772. Da es sich um eine abwärtskompatible Änderung handelt, sollte es ziemlich einfach sein, auf 2.4.x zurück zu portieren.
Ich habe diese PR als "Community" markiert, da dies eine experimentelle Funktion in einer älteren Version ist. Daher hat dies für uns keine Priorität, aber es wäre eine gute Aufgabe für ein Community-Mitglied, sich damit zu befassen.
2.4.x ist EOL