2016-04-19 8 views
5

Ich habe einige Probleme mit Typen. In diesem Fall habe ich zwei Merkmale mit Basismethoden, und eine davon hängt von der anderen ab. Danach habe ich zwei Implementierungen für sie. Haben Sie eine Idee was hier falsch ist?Eigenschaft stimmt nicht überein mit Typ Parameter Grenzen

Der Compiler sagt:

type arguments [ImplDefinition,ImplDto,ImplDtoIdentifier] do not conform to trait ChildOperations's type parameter bounds [C <: Types.BaseT[A,I],A <: Types.IDObj[I],I <: IIdentifier] 
[error] class ImplOperations extends Parent2(new ImplDefinition) with ChildOperations[ImplDefinition, ImplDto, ImplDtoIdentifier] { 

Der Code:

/* 
* Generic Implementation 
*/ 

object Types { 

    type IDObj[I <: IIdentifier] = AnyRef {def id: I} 

    type BaseT[A, I <: IIdentifier] = Parent1[A] { 
    def id: Foo[I] 
    } 

} 

trait IIdentifier extends Any { 
    def id: Long 

    override def toString = id.toString 
} 

class Parent1[A](a: String) 

class Foo[A](a: String) 

trait ChildDefinition[A <: Types.IDObj[I], I <: IIdentifier] { 
    self: Parent1[A] => 

    def id(a: A): Foo[I] 

} 

class Parent2[A](a: A) 

trait ChildOperations[C <: Types.BaseT[A, I], A <: Types.IDObj[I], I <: IIdentifier] { 
    self: Parent2[C] => 

    def get(identifier: I): Option[A] 
} 

/* 
* Concrete Implementation 
*/ 

case class ImplDtoIdentifier(id: Long) extends IIdentifier 

case class ImplDto(id: ImplDtoIdentifier, name: String) 

class ImplDefinition extends Parent1[ImplDto]("Value") with ChildDefinition[ImplDto, ImplDtoIdentifier] { 
    override def id(a: ImplDto): Foo[ImplDtoIdentifier] = ??? 
} 

class ImplOperations extends Parent2(new ImplDefinition) with ChildOperations[ImplDefinition, ImplDto, ImplDtoIdentifier] { 
    self => 
    override def get(identifier: ImplDtoIdentifier): Option[ImplDto] = ??? // here I will use the id method from ImplDefinition 
} 
+0

Persönlich wollte ich einen Blick nehmen und Ihnen einen Hinweis geben, aber ich don‘ Ich habe genug Zeit, um herauszufinden, was hier vor sich geht. Sie haben 11 Klassen/Merkmale, und das schließt die zusätzlichen Typen aus. Wenn Sie Ihr Beispiel auf [MCVE] (http://stackoverflow.com/help/mcve) eingrenzen, haben Sie eine viel größere Chance auf eine gute Antwort. – slouc

+0

Ich habe dieses Snipet bereits gemacht und alle übrigen Teile entfernt. Aber du hast recht, es ist immer noch riesig. Nicht sicher, ob es hilft, aber wenn Sie die Klasse ImplOperations entfernen, kompiliert es. Das Problem besteht darin, die ChildOperarions-Typen zu überprüfen. – rtfpessoa

Antwort

4

das Problem der Unterzeichnung des id def in ImplDefinition zu sein scheint. Types.BaseT bittet um ein def id: Foo[I] aber ImplDefinition liefert nur ein def id(a: ImplDto): Foo[ImplDtoIdentifier] , wenn Sie ein def id:Foo[ImplDtoIdentifier] = ??? die ImplDefinition Klasse Dinge hinzufügen kompilieren:

class ImplDefinition extends Parent1[ImplDto]("Value") with ChildDefinition[ImplDto, ImplDtoIdentifier] { 
    def id:Foo[ImplDtoIdentifier] = ??? 
    override def id(a: ImplDto): Foo[ImplDtoIdentifier] = ??? 
} 
Verwandte Themen