2017-02-02 15 views
0

Я пытаюсь расширить общую функцию mSort для работы с implicits и ограничениями типа. Он отлично работает, когда я использую общий признак, чтобы продлить заказ, но не с абстрактным классом. вы можете помочь?Scala typebounds не работает с абстрактным классом, но работает с чертами

object MergeSort extends App { 

    // With Abstract Class 
    abstract class Id(id: Int) extends Ordered[Id] { 
    override def compare(that: Id): Int = this.id.compareTo(that.id) 
    } 
    case class Emp(id: Int, name: String) extends Id(id) { 
    //override def compare(that: Emp): Int = this.name.compareTo(that.name) 
    } 

//// With Traits: Works fine 
// trait Id extends Ordered[Id]{ 
// val id: Int 
// override def compare(that: Id): Int = this.id.compareTo(that.id) 
// } 
// case class Emp(id: Int, name: String) extends Id { 
// //override def compare(that: Emp): Int = this.name.compareTo(that.name) 
// } 


    object MSort { 
    def msort[T <% Ordered[T]](list: List[T])(implicit less: (T, T) => Boolean): List[T] = { 
     def merge(xs: List[T], ys: List[T]): List[T] = { 
    (xs, ys) match { 
     case (Nil, _) => ys 
     case (_, Nil) => xs 
     case (x :: xs1, y :: ys1) => if (less(x, y)) x :: merge(xs1, ys) else y :: merge(xs, ys1) 
    } 
     } 
     val n = list.length/2 
     if(n==0) list 
     else { 
    val (ys, zs) = list.splitAt(n) 
    merge(msort(ys), msort(zs)) 
     } 
    } 
    } 

    implicit def less [T <% Ordered[T]] (x: T, y: T): Boolean = x <= y 
// MSort.msort[Int](List(6, 3, 9, 1)).foreach(println) 
// MSort.msort[Char](List('a', 'z', 'Z', 'D')).foreach(println) 
// MSort.msort[String](List("appolo", "lunar", "Zapplin", "Kafka")).foreach(println) 
// MSort.msort[Double](List(12.3, 14, 19.3, -32.443)).foreach(println) 
    MSort.msort[Id](List(Emp(7, "appolo"), Emp(2, "lunar"), Emp(9, "Zapplin"), Emp(1, "Kafka"))).foreach(println) 

} 

Ошибка:

Error:(5, 66) value id is not a member of MergeSort.Id 
override def compare(that: Id): Int = this.id.compareTo(that.id) 

ответ

4

Без ид "VAL" просто конструктор Arg, а не свойство класса.

abstract class Id(id: Int) extends Ordered[Id] { 
    override def compare(that: Id): Int = this.id.compareTo(that.id) 
} 

Это также означает, что ваш аргумент идентификатор эМп должен быть помечен как переопределение

case class Emp(override val id: Int, name: String) extends Id(id) { 
    //override def compare(that: Emp): Int = this.name.compareTo(that.name) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^