Несоответствие типов; найдено: 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
}

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


person Electric Coffee    schedule 07.04.2014    source источник
comment
Вы также можете использовать это: def >(that: List[_]): ...., так как вам не нужен фактический тип   -  person serejja    schedule 07.04.2014
comment
это действительно может быть хорошей идеей... странно, как я никогда не думал об этом   -  person Electric Coffee    schedule 07.04.2014


Ответы (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. Поэтому компилятор игнорирует это неявное преобразование и выдает ошибку компиляции.

person tiran    schedule 07.04.2014
comment
забавно, мы одновременно добавили одно и то же решение - person Electric Coffee; 07.04.2014