Roberts Antwort behandelt die technischen Details von Context Bounds. Ich werde Ihnen meine Interpretation ihrer Bedeutung geben.
In Scala A <% B
erfasst a View Bound ( ) das Konzept von 'kann als' gesehen werden (während eine Obergrenze <:
das Konzept von 'is a' erfasst). Ein Kontext gebunden ( A : C
) sagt 'hat ein' über einen Typ. Sie können die Beispiele zu Manifesten als " T
hat ein Manifest
" lesen . Das Beispiel, das Sie mit about Ordered
vs verknüpft haben, Ordering
zeigt den Unterschied. Eine Methode
def example[T <% Ordered[T]](param: T)
sagt, dass der Parameter als ein gesehen werden kann Ordered
. Vergleichen mit
def example[T : Ordering](param: T)
was besagt, dass dem Parameter eine zugeordnet ist Ordering
.
In Bezug auf die Verwendung hat es eine Weile gedauert, bis Konventionen festgelegt wurden, aber Kontextgrenzen werden gegenüber Ansichtsgrenzen bevorzugt ( Ansichtsgrenzen sind jetzt veraltet ). Ein Vorschlag ist, dass eine Kontextbindung bevorzugt wird, wenn Sie eine implizite Definition von einem Bereich in einen anderen übertragen müssen, ohne direkt darauf verweisen zu müssen (dies ist sicherlich der Fall, wenn ClassManifest
ein Array erstellt wird).
Eine andere Art, über Sicht- und Kontextgrenzen nachzudenken, besteht darin, dass beim ersten Mal implizite Konvertierungen aus dem Bereich des Anrufers übertragen werden. Der zweite überträgt implizite Objekte aus dem Bereich des Aufrufers.