代码之家  ›  专栏  ›  技术社区  ›  Electric Coffee

类型不匹配;找到:需要Int(1):B

  •  4
  • Electric Coffee  · 技术社区  · 11 年前

    我正在尝试扩展 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] 它工作得很好,但这样我就不能使用包含两种不同类型的列表。。。

    为什么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 回复  |  直到 11 年前
        1
  •  6
  •   tiran    11 年前

    在helper类中定义类型 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 因此,编译器忽略了这种隐式转换,并给出了编译错误。

    推荐文章