2013-12-08 2 views
4

첫 번째 오류 :서명에 '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 extend'로 변경하십시오. – nafg

+1

또 다른 :'val dataSetup : DataSetup = ...'. 흥미롭게도, 2.9에서 오류 메시지는 조금 다르게 나타납니다 :'found : 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의 기본 인수 방법에 합성 추가) 주석처럼 보인다.

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

분명히 유형은 주석 없이는 적합하지 않습니다. 그것은 왜 물어 가치 : 다른 고전 paulpism와

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

: 당신이 당신의 경우 클래스 메모리의 이름을 경우 공식적으로

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

+0

실제로 녹색 체크를 얻으려고 고칠 필요가 없었습니다. 우리 중 일부는 녹색 체크 만받습니다. –