2013-02-23 62 views
0

對象O擴展了T1的特性,其中定義了C類型。類型不匹配:對象中引用的類型與對象擴展的特徵中定義的類型不同?

T1我想操縱對象O中定義的靜態數據結構stack。 但是編譯器不斷抱怨

類型不匹配發現T1.this.C,需要OC

的代碼是這樣的:

trait T1 { 

case class C(i: Int, s: String) 
    def dumbAdd(i: Int, s: String) = { 
    O.stack.push(C(i, s)) // type mismatch error goes here. 
    } 
} 

object O extends T1 { 

    var stack: Stack[C] = new Stack[C] 

} 

我感到困惑......沒有按't O知道C,應該與T1中的那個類型相同? 我在這裏錯過了什麼? ,我該如何做我想做的事?

更新

基於一個建議,把C在對象T1,但在我的真實的例子,對象T1不能訪問到性狀T1定義的類型。降低的問題如下:

trait T1 { 

    abstract sealed class S 

    case class SC extends S 

    def dumbAdd(i: Int, s: String) = { 
    O.stack.push(C(i, s)) 
    } 
} 

object T1 { 

    case class C(i: Int, s: String) 

    def tryASC { 
    val scc = SC() // Here the compiler says not found value SC 
    } 
} 

object O extends T1 { 

    var stack: Stack[C] = new Stack[C] 

} 
+0

請添加錯誤消息的行和符號,以便我們確切知道_where_發現了不匹配。 – 2013-02-23 20:30:43

+0

@ DanielC.Sobral我更新了這篇文章。謝謝! – monica 2013-02-23 20:33:43

回答

6

嵌套類屬於它們的父類的一個實例。即,類型xy下面是不同的:

val a = new T1 {} 
val b = new T2 {} 
val x = new a.C(0, "") 
val y = new b.C(0, "") 

類型的x是,從字面上看,a.C,以及y類型是b.C

代碼中的問題在於,您指的是C,而未指定該屬於哪個實例,最終結果是它們都假定來自不同的實例。

嵌套類是有用的,但由於其非常嚴格的語義而難以使用。

+0

路徑依賴類型。一個解決方案:將C放入「對象T1」中。 – pedrofurla 2013-02-23 20:42:31

+0

@pedrofurla是的。但似乎對象T1不能訪問特徵T1中定義的類型s(類)...... – monica 2013-02-23 21:55:40

+0

在你的例子中沒有定義類型。 – pedrofurla 2013-02-23 22:01:39

相關問題