2016-12-05 5 views
0

nicht ableiten Ich verwende Scala und CouchDB und habe eine generische save Methode erstellt, um meine Objekte in der Datenbank zu speichern. Da es generisch ist, kann es den Code nicht kompilieren.Konnte Typ

Meine generic save Methode wie folgt aussieht:

abstract class AbstractRepository[T] extends LazyLogging { 
    private val config = ConfigFactory.load() 
    private val hostname: String = config.getString("couchdb.hostname") 
    private val port: Int = config.getInt("couchdb.port") 

    val couch = CouchDb(hostname, port) 
    val mapping: TypeMapping 
    val db: CouchDbApi 

    def save(item: T): Unit = { 
    db.docs.create(item) 
    } 
} 

AbstractRepository von SummonerRepository erweitert wird:

class SummonerRepository extends AbstractRepository[Summoner] { 
    val mapping = TypeMapping(classOf[Summoner] -> "Summoner") 
    val db = couch.db("summoner-db", mapping) 
} 

Wenn ich versuche, dies zu kompilieren bekomme ich diesen Fehler:

Error:(24, 34) Couldn't derive type T db.docs.create(item)

I verstehe nicht, warum das nicht abgeleitet werden kann . Warum ist das und gibt es einen Weg um diesen Fehler?

Edit: Als ich den Typen Summoner warf es funktioniert einwandfrei, aber das ist keine Verwendung, da es nicht mehr generisch sein wird:

def save(item: T): Unit = { 
     db.docs.create(item.asInstanceOf[Summoner]) 
     } 
+0

Aus der einfachen Scala-Sicht ist alles in Ordnung (dh, eine Methode mit einem generischen Parameter, der als abstrakter Klassentypparameter definiert ist und diesen mit einem konkreten Typwert instanziiert). Die Fehlermeldung scheint mir jedoch unbekannt zu sein, also habe ich es gegoogelt und nichts gefunden; nur ein paar irrelevante Probleme mit der gleichen Nachricht, die Fehler aufgrund von Dateinamenskonflikten oder Fallklassen mit> 21 Feldern hatte. Ich denke, es könnte eine CouchDB-Sache sein. Welche Art von Parameter nimmt 'db.docs.create' an? Sicherlich kann es keinen generischen 'T' Typ geben, der im äußeren Bereich definiert ist. – slouc

+0

Funktioniert 'db.docs.create [T] (item)'? – ipoteka

+0

@ipoteka Das hat leider nicht funktioniert – RemcoW

Antwort

0

nur zum Testen, können Sie Ihre Klasse Summoner umbenennen für $ Beschwörer und nochmal testen. Der Code für couchdb-scala versucht, den Namen mit getCanonicalName zu erhalten, und es wirft eine java.lang.InternalError: Malformed Klassenname. Erstaunlich ... oder?

Verwandte Themen