2013-12-08 73 views
4

首先錯誤:在簽名混淆Scala的類型不匹配錯誤與「uncheckedVariance」

/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特徵的實例。它當然是真實代碼的簡化版本。

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) 
    } 
    } 

} 

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

+0

根據記錄,它的工作原理,如果你只是命名案例類的內存。一個子類可以「實現」一個具有類或特徵的抽象類型。 – nafg

+0

另一個工作變體:將'val dataSetup = new'更改爲'object dataSetup extends' – nafg

+1

還有一個:'val dataSetup:DataSetup = ...'。有趣的是,在2.9的錯誤消息的措辭略有不同:'發現:Use.dataSetup.type(與基礎型...' – nafg

回答

2

有時,錯誤消息已經在最新的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 
      ^

無論如何,它看起來像註釋(合成加入到copy默認ARG方法)中推斷出的類型都將丟失。

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

很明顯,這個類型不符合沒有註釋。值得探討的是爲什麼:

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

另一個經典paulpism:

I lost count at some point but I didn't notice that many refinements of AnyRef.

+0

我不應該實際上修復它以獲得綠色支票,對嗎?我們中的一些人只能以綠色支票付款。 –