簡體   English   中英

將Scala類型不匹配錯誤與簽名中的“uncheckedVariance”混淆

[英]Confusing Scala type mismatch error with 'uncheckedVariance' in signature

首先是錯誤:

/Users/rob/Workspace/Boiled.scala:9: error: type mismatch;
 found   : DataSetup{type Mem <: Product with Serializable{val ids: List[Int]; def copy(ids: List[Int]): this.Mem; def copy$default$1: List[Int]}; object Mem; type Memory = this.Mem}
 required: DataSetup{type Mem <: Product with Serializable{val ids: List[Int]; def copy(ids: List[Int]): this.Mem; def copy$default$1: List[Int] @scala.annotation.unchecked.uncheckedVariance}; object Mem; type Memory = this.Mem}
 val dataSetup = new DataSetup {
     ^

可愛不是嗎? 它指向我嘗試創建DataSetup特征實例的DataSetup 它當然是真實代碼的簡化版本。

trait DataSetup {
  type Memory <: AnyRef with Serializable 
  def run(): Memory
}

object Use {

  val dataSetup = new DataSetup {     // <---- error reported here
    case class Mem(ids: List[Int])
    type Memory = Mem
    def run(): Memory = {
      val ids = List(1,2,3)
      Mem(ids)
    }
  }

}

我真的不知道它在抱怨什么。 任何人?

有時,錯誤消息在最新的2.11里程碑中有所改進。

<console>:14: error: type mismatch;
 found   : DataSetup{type Mem(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>) <: Product with Serializable{val ids: List[Int]; def copy(ids: List[Int]): this.Mem(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>); def copy$default$1: List[Int]}; type Memory = this.Mem(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)}
 required: DataSetup{type Mem(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>) <: Product with Serializable{val ids: List[Int]; def copy(ids: List[Int]): this.Mem(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>); def copy$default$1: List[Int] @scala.annotation.unchecked.uncheckedVariance}; object Mem; type Memory = this.Mem(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)(in <refinement of DataSetup>)}
         val dataSetup = new DataSetup {     // <---- error reported here
             ^

無論如何,在推斷類型中看起來像注釋(合成地添加到默認的arg copy方法)。

val dataSetup: DataSetup = new DataSetup {     // <---- no error here

顯然,沒有注釋,類型不符合。 值得問為什么:

https://issues.scala-lang.org/browse/SI-8071

與另一個經典的paulpism:

我在某個時候失去了數,但我沒有注意到AnyRef的許多改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM