Несоответствие типов; найдено: 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
, Следовательно, компилятор игнорирует это неявное преобразование и выдает ошибку компиляции.