【问题标题】:Scala generics implementing Ordered[A[B]] gives strange compiler errors实现 Ordered[A[B]] 的 Scala 泛型给出了奇怪的编译器错误
【发布时间】:2016-01-27 21:29:40
【问题描述】:

我有奇怪的错误信息,我无法用 asInstanceOf[T] 修复它

 trait ABase {
    type A <: ABase
    def compare(that: A): Int
  }

  case class B [A <: ABase] (someField: A) {
    //extends Ordered[B[A]] {
    def compare1(that: B [A]): Int = someField.asInstanceOf[A].compare(that.someField.asInstanceOf[A])
    /*Error: type mismatch;
 found   : A
 required: _1.A where val _1: A
    = someField.asInstanceOf[A].compare(that.someField.asInstanceOf[A])*/
    def compare2(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[A])
    /*Error: type mismatch;
 found   : A
 required: B.this.someField.A
    = someField.compare(that.someField.asInstanceOf[A])*/
    def compare3(that: B [A]): Int = someField.compare(that.someField)
    /*Error: type mismatch;
 found   : that.someField.type (with underlying type A)
 required: B.this.someField.A
    = someField.compare(that.someField)*/
  }

错误本身

错误:类型不匹配; 找一个 必需:_1.A 其中 val _1:A

【问题讨论】:

  • SO 问题不应包含要点,而应将代码嵌入问题中。 SO 解析器在这里工作正常;)
  • 您将AB[A] 进行比较,您应该重新提出您的问题并解释您想要达到的目标。
  • 不,我不是。错误消息清楚地表明了这一点。说的再清楚不过了……
  • 我无法正确格式化我的代码,我在这里没有看到 markdown 或任何 html 编辑器的选项。所以我不断收到来自 SO 解析器的错误
  • @KostyaCallmetofindout 编辑时,有一个名为code sample 的按钮。它看起来像两个花括号 {}。您选择您的代码并按下它。从未如此简单(老实说,我在 SO 两年后才看到它。我之前手动格式化我的代码:))

标签: scala generics


【解决方案1】:

您可以通过转换为 B 的 (this) someField 类型来修复它:

trait ABase {
  type A <: ABase
  def compare(that: A): Int
}

case class B [A <: ABase] (someField: A) {

  def compare1(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[this.someField.A])

  def compare2(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[this.someField.A])

  def compare3(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[this.someField.A])
}

你也可以保留一个 type 属性让它更简洁:

case class B [A <: ABase] (someField: A) {

  type ThisA = this.someField.A

  def compare1(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[ThisA])

  def compare2(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[ThisA])

  def compare3(that: B [A]): Int = someField.compare(that.someField.asInstanceOf[ThisA])
}

【讨论】:

  • 酷,非常感谢。但是只有我觉得奇怪吗?似乎不是一个好习惯 - 更像是一些编译器黑客的副作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多