Как реализовать классы типов для рекурсивных обобщений? - PullRequest
0 голосов
/ 08 октября 2018

Я хотел бы использовать классы типов, чтобы обеспечить специализированную реализацию для универсального класса.Беда в том, что класс рекурсивен, и я не нашел способа написать код, чтобы он работал.Вот моя попытка:

object Compare {
  trait Compare[T <: Compare[T]] {
    def compare(that: T): Boolean
  }

  trait IsCompare[T] {
    def check: Boolean
  }

  trait LowerLevelImplicits {
    implicit def defaultCompare[T]: IsCompare[T] = new IsCompare[T] {
      def check = false
    }
  }

  trait Implicits extends LowerLevelImplicits {
    implicit def isCompare[T: Compare]: IsCompare[T] = new IsCompare[T] {
      def check = true
    }
  }

  case class MyClass(value: Int) extends Compare[MyClass] {
    override def compare(that: MyClass) = this equals that
  }
}

import Compare._

object Main extends App with Implicits {

  def matchArray[T: IsCompare](array: Array[T]) = {
    if (implicitly[IsCompare[T]].check) {
      println("Using isCompare")
    } else {
      println("Not using isCompare")
    }
  }


}

Ошибка:

Ошибка: (17, 29) аргументы типа [T] не соответствуют чертам границ параметра типа сравнения [T]<: Compare.Compare [T]] </p>

implicit def isCompare[T: Compare]: IsCompare[T] = new IsCompare[T] {

1 Ответ

0 голосов
/ 08 октября 2018

Попробуйте изменить подпись метода isCompare на:

implicit def isCompare[T <: Compare[T]]: IsCompare[T] = //...
...