2013-02-23 2 views
0

Объект O расширяет черту T1, который имеет тип C.Несоответствие типов: тип, на который ссылается объект, не тот, который указан в признаке, который распространяется на объект?

В T1 Я хочу управлять статической структурой данных stack, определенной в объекте O. но компилятор продолжает жаловаться

типа несоответствия, которые нашли 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? Что мне здесь не хватает? и как я могу делать то, что хочу?

Update

Основываясь на одно предложение поставить 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_, что было обнаружено несоответствие. –

+0

@ DanielC.Sobral Я обновил сообщение. благодаря! – monica

ответ

6

Вложенные классы принадлежат к примеру своего родительского класса. То есть, типы x и y ниже различны:

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, не указав, к какому экземпляру принадлежит C, причем конечный результат состоит в том, что все они предполагаются из разных экземпляров.

Вложенные классы полезны, но сложны в использовании из-за их очень строгой семантики.

+0

Типы, зависящие от пути. Одно решение: положите C в 'объект T1'. – pedrofurla

+0

@pedrofurla да. но кажется, что объект T1 не может получить доступ к типу s (классы), определенному в trat T1 .... – monica

+0

В вашем примере не существует типа s. – pedrofurla