Несоответствие типов; найдено: Int(1) требуется: B

Я пытаюсь продлить List класс, чтобы дать ему более упорядоченный способ сравнения размеров, однако я сталкиваюсь с ошибкой в ​​названии...

Вот мой код:

implicit class RichList[A, B](input: List[A]) {
  def >(that: List[B]): Boolean = input.size > that.size
  def <(that: List[B]): Boolean = input.size < that.size
}

Идея заключалась в том, что, поскольку все это позволяет сравнивать размеры списков, их типы могут быть разными, и это не имеет значения, однако, когда я пытаюсь сделать это:

val test = List(1,2,3,4) < List(1,2,3,4,5)

Я получаю вышеупомянутую ошибку. Если я уберу B и установлю that быть типом List[A] это работает нормально, но тогда я бы не смог использовать списки, содержащие 2 разных типа...

Почему A и B не могут быть одного типа? Или я что-то упустил?

Изменить: Хорошо, я нашел решение для ошибки, которая довольно проста:

implicit class RichList[A](input: List[A]) {
  def >[B](that: List[B]): Boolean = input.size > that.size
  def <[B](that: List[B]): Boolean = input.size < that.size
}

Однако мой вопрос все еще стоит; почему я не могу сделать это по-другому?

1 ответ

Решение

В вашем классе помощника вы определяете тип B в классе инициализации. Но этот тип неизвестен, пока метод > или же < использование.

Мое решение будет таким.

implicit class RichList[A](input: List[A]) {
  def >[B](that: List[B]): Boolean = input.size > that.size
  def <[B](that: List[B]): Boolean = input.size < that.size
}

редактировать

Поскольку вы спросили, почему это невозможно по-другому, рассмотрите следующий пример.

List(1,2,3) > List("1", "2")

Мы надеемся, что это неявно расширится до (этого не произойдет)

new RichList[Int, B](List[Int](1,2,3)).>(List[String]("1", "2"))

Но, типа B не разрешено String, Следовательно, компилятор игнорирует это неявное преобразование и выдает ошибку компиляции.

Другие вопросы по тегам