2015-03-30 13 views
5

Nach ein paar Beispielen zu gehen, muss ich sagen, ich verstehe nicht, was die F-Bounded Polymorphic bringt.scala f-beschränkte Typen Erklärung

Um das Beispiel von scala Schule (https://twitter.github.io/scala_school/advanced-types.html#fbounded)

Sie verwenden erklären, dass sie einen F-Bounded Typen benötigen, so dass die Unterklasse das Subtyp zurückkehren kann. So sie etwas tun, wie folgt aus:

trait Container[A <: Container[A]] extends Ordered[A] 
class MyContainer extends Container[MyContainer] { 
    def compare(that: MyContainer) = 0 
} 

Aber ich sehe nicht, was ist der Gewinn dieser Art von Art der Verwendung, wenn Sie so etwas wie diese verwenden:

trait Container[A] extends Ordered[A] 
class MyContainer extends Container[MyContainer] { 
    def compare(other: MyContainer) = 0 
} 

Jede Erklärung ist sehr

begrüßt

Dank

Antwort

4

Der Vorteil kommen würde, wenn es so etwas wie folgt aussieht:

trait Container[A <: Container[A]] extends Ordered[A] { 
    def clone: A 
    def pair: (A, A) = (clone, clone) 
} 

class MyContainer extends Container[MyContainer] { 
    def clone = new MyContainer 
} 

Jetzt erhalten Sie pair kostenlos, und Sie erhalten den richtigen Rückgabetyp. Ohne etwas Ähnliches müssen Sie jede einzelne Methode manuell überschreiben, die den gleichen Typ zurückgibt (viele sinnlose Boilerplate), oder Sie verlieren Spezifität in Ihren Typen, sobald Sie eine nicht überschriebene Methode aufrufen.

+1

Ich denke, ich habe Nishans Argument und für mich ergibt es Sinn, aber der Teil, über den du redest, ist der Teil, der mich verwirrt. In Ihrem Beispiel könnten Sie A wie folgt definieren: Merkmal Container [A] und dasselbe Ergebnis erhalten. Sie müssen die Paarfunktion in der Unterklasse nicht überschreiben –

+0

Oh, egal, ich habe es gerade. Wenn Sie Container [A] kennzeichnen, können Sie nicht garantieren, dass der zurückgegebene Typ A in der Unterklasse vom Typ Container ist. Danke vielmals –

1

In Scala können Sie Ihre Typparameter durch einen Typ gebunden machen. Hier machen Sie in Ihrer ersten Methode Ihren Typparameter, indem Sie eine Obergrenze mit der Unterklasse von Container festlegen.

Mit Ihrer ersten Methode können Sie keine Parameter in der Container-Klasse übergeben, die keine Unterklasse Ihrer Container-Klasse ist.

In Ihrem zweiten Beispiel können Sie Parameter Typ Instanz jeder Klasse übergeben. Hier beschränken Sie also nichts, während Sie im ersten Beispiel den Typ-Untertyp der Container-Klasse einschränken.

Verwandte Themen