2016-11-11 7 views
0

Für die Wieder Status und Schlüssel einer Datenbank Insert enthält, habe ich die folgende Struktur:Typ Parameter, der Typ-Parameter selbst

sealed trait InsertResult[+I] extends Product with Serializable 

object InsertResult { 
    case class Created[+I](insertedId: I) extends InsertResult[I] 
    case object DuplicateKey extends InsertResult[Nothing] 
} 

Der Typ-Parameter I ist die Art des Schlüssels, der erstellt wurde (zB UUID). Wenn die Einfügung erfolgreich ist, wird Created[I] zurückgegeben; Im Falle eines doppelten Schlüsselfehlers wird das Objekt DuplicateKey zurückgegeben.

Dies funktioniert, aber da die Datenbank nur den Schlüssel mehr Metadaten als fügt hinzu, möchte ich I von Entity[I, T] ersetzen, wo I noch der Schlüsseltyp während T ist die Art des eingesetzten Objekts darstellt (also im Grunde ein InsertResult[Entity[I, T]]). Allerdings habe ich Probleme damit, nur den Typparameter zu ersetzen gibt mir einen Fehler für den Parameter insertedId (I und T kann nicht aufgelöst werden). Wie müssen die Typ- und Methodensignaturen aussehen, wenn I durch Entity[I, T] ersetzt wird?

+0

wäre es hilfreich, die Signatur der 'insert' Funktion sehen Sie zur Zeit an der richtigen Stelle, das heißt die Funktion, die' kehrt InsertResult' – Andrey

+0

es ist immer noch unklar, was 'T' tatsächlich ist. Sie haben angegeben, dass 'T den Typ des eingefügten Objekts darstellt. Aus Ihrem Kommentar scheint jedoch, dass das eingefügte Objekt tatsächlich eine Unterklasse von Entity ist. Also was ist T? – Andrey

+0

Ah ja, tut mir leid. 'Entity [I, T]' ist eine Case-Klasse, die Erstellung einer Instanz könnte wie folgt aussehen: Entity (neue UUID, new Foo) '. Die Signatur einer konkreten Insert-Implementierung sieht wie folgt aus: ceran

Antwort

0

Wäre das nicht genug für Ihren Anwendungsfall?

case class Entity[I, T](id: I, obj: T) 

sealed trait InsertResult[I, T] extends Product with Serializable 

object InsertResult { 
    case class Created[I, T](entity: Entity[I, T]) extends InsertResult[I, T] 
    case object DuplicateKey extends InsertResult[Nothing, Nothing] 
} 
0
package com.example 

object Answer extends App { 
    case class Entity[I, T](id:I, obj:T) 

    sealed trait InsertResult extends Product with Serializable {} 

    object InsertResult { 
    case class Created[I, T](entity:Entity[I, T]) extends InsertResult 
    case object DuplicateKey extends InsertResult 
    } 

    object Storage { 
    var data = Map.empty[Any, Any] 

    def insert[I, T](entity:Entity[I, T]):InsertResult = 
     data.get(entity.id) match { 
     case Some(_) => InsertResult.DuplicateKey 
     case None => 
      data += entity.id -> entity.obj 
      InsertResult.Created(entity) 
     } 
    } 

    val entities = Seq(Entity(1, "foo"), Entity(2, "bar"), Entity(1, "foobar")) 
    entities map Storage.insert foreach println 
} 
Verwandte Themen