2017-01-24 5 views
2

Ich habe eine EigenschaftWie richtig bestellt zu implementieren

trait Weight { 
    def getWeight: Int 
} 

Mehrere Klassen erbt es, Beispiel:

case class Test(n: Int) extends Weight { 
    override def getWeight: Int = n 
} 

Jetzt möchte ich alle Weight Subklassen Sortier Fähigkeit hinzuzufügen. Ich fügte hinzu, Ordered-Weight:

trait Weight extends Ordered[Weight] { 

    def getWeight: Int 

    override def compare(that: Weight): Int = this.getWeight.compareTo(that.getWeight) 
} 

Versuchen Sortierung:

val seq = Seq(Test(1), Test(4), Test(3), Test(2)) 

seq.sorted // error 

Und es ist nicht compiliert:

Error:(74, 6) diverging implicit expansion for type scala.math.Ordering[A$A254.this.Test] starting with method $conforms in object Predef seq.sorted;} ^

Was mache ich falsch?

+0

Ich denke Problem über „dieses“ in Zug Gewicht ist. auf Eigenschaft kann man nicht "this" verwenden, weil man keine Eigenschaft instanziieren kann –

+0

Ich denke nein, weil nur "sortierte", die implizit Ordering verwendet, einen Fehler auslöst. – zella

+0

dass, weil ich denke, ist das erste Mal auf Ihrem Code, wo Sie "vergleichen" -Methode - Aber ich könnte schrecklich falsch –

Antwort

1

Ihre Lösung funktioniert nicht, weil Ordered[T] in T unveränderlich ist, was bedeutet, dass Ordered[Weight] keine Beziehung zu Ordered[A] hat. Sie müssten dies in den Unterklassen angeben.

Sie könnten eine implizite Ordering anstelle einer Ordered verwenden.

trait Weight{ 
    def getWeight : Int 
} 

object Weight{ 
    implicit def ordering[T <: Weight] : Ordering[T] = Ordering.by(w => w.getWeight) 
} 
    case class A(w : Int) extends Weight{ 
    def getWeight = w 
} 
case class B(w : Int) extends Weight{ 
    def getWeight = w 
} 

import Weight._ 

Seq(A(1),B(2),B(0),A(3),A(-3)).sorted 

Wird in Folge:

List(A(-3), B(0), A(1), B(2), A(3)) 

Beachten Sie, dass diese Lösung auf einem Ordering[Int] beruht verfügbar sein (das ist standardmäßig aktiviert).

2

Eine andere Lösung ein bisschen anders als MDM. Da sorted eine implizite von Ordering dauert, können Sie folgendes tun:

seq.sorted(Ordering[Weight]) 
+1

'seq.sorted [Gewicht]' funktioniert auch – Kolmar

Verwandte Themen