considerano una funzione generica:come applicare tipo non generico al momento della compilazione
def genericFn[T](fn: T => Boolean): Unit = {
// do something involves T
}
è esso possibile limitare T
(al momento della compilazione) per essere un tipo semplice, non un tipo come List[Int]
?
il problema subalterno Voglio risolvere è qualcosa di simile:
var actorReceive: Receive = PartialFunction.empty
def addCase[T](handler: T => Boolean): Unit = {
actorReceive = actorReceive orElse ({
case msg: T => // call handle at some point, plus some other logic
handler(msg)
})
}
la funzione addCase
si tradurrebbe in allarme la cancellazione tipo, che potrebbe essere risolto richiedendo ClassTag
come: def addCase[T: ClassTag](...
, ma ClassTag
ancora non può evitare le chiamate come:
addCase[List[Int]](_ => {println("Int"); true})
addCase[List[String]](_ => {println("String"); false})
actorReceive(List("str")) // will print "Int"
il codice qui sopra stampare "Int"
mentre non emette alcun avviso o errore, c'è una via d'uscita?
Dato che hai a che fare con akka qui, ho scoperto che provare a fare messaggi "generici" sarà un grosso problema, specialmente se tipo di serializzazione sta succedendo. Ad un livello più generale, il tipo di Int e List [Int] sono entrambi *, quindi un singolo parametro di tipo senza altre restrizioni non li differenzia. Probabilmente sarebbe sufficiente una soluzione standard per la tipizzazione, oppure potresti usare qualcosa di più avanzato come il link dk14 fornito. – melps
Puoi aggiungere protezione da 'List': http://stackoverflow.com/questions/15962743/using-context-bounds-negatively-to-ensure-type-class-instance-is-absent-from-s – dk14
ma io Non sono sicuro di come generarlo su qualsiasi tipo polimorfo – dk14